Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1501;
  4. vector<pair<int,int>> v[N*N];
  5. vector<int> t[N*N];
  6. int knd[N*N];
  7. int a[N][N];
  8. int pos[N][N];
  9. int arj[N][N];
  10. int get(int x,int tl,int tr,int v,int l,int r){
  11. if(tl<=l&&r<=tr){
  12. return t[x][v];
  13. }
  14. else{
  15. int m=(l+r)/2;
  16. int cur=0;
  17. if(tl<=m)cur=max(cur,get(x,tl,tr,v+v,l,m));
  18. if(tr>m)cur=max(cur,get(x,tl,tr,v+v+1,m+1,r));
  19. return cur;
  20. }
  21. }
  22. void upd(int x,int pos,int l,int r,int v,int val){
  23. if(l==r){
  24. t[x][v]=max(t[x][v],val);
  25. }
  26. else{
  27. int m=(l+r)/2;
  28. if(pos<=m)upd(x,pos,l,m,v+v,val);
  29. else upd(x,pos,m+1,r,v+v+1,val);
  30. t[x][v]=max(t[x][v+v],t[x][v+v+1]);
  31. }
  32. }
  33. int ans[N*N];
  34. int hw[N*N];
  35. int main(){
  36. // freopen("input.txt","r",stdin);
  37. int n;
  38. cin>>n;
  39. for(int i=1;i<=n;++i)
  40. for(int j=1;j<=n;++j){
  41. scanf("%d",&a[i][j]);
  42. v[a[i][j]].push_back({j,i});
  43. ++hw[a[i][j]];
  44. }
  45. for(int i=1;i<=n*n;++i){
  46. if(hw[i]==1){
  47. ++ans[1];
  48. continue;
  49. }
  50. sort(v[i].begin(),v[i].end());
  51. if(hw[i]==2){
  52. if(v[i][1].second>=v[i][0].second&&v[i][1].first>=v[i][0].first){
  53. ans[2]+=2;
  54. }
  55. else {
  56. ans[1]+=2;
  57. }
  58. continue;
  59. }
  60. int cn=0;
  61. for(int j=0;j<v[i].size();++j){
  62. if(j==0||v[i][j].first!=v[i][j-1].first)
  63. pos[v[i][j].second][v[i][j].first]=cn++;
  64. else{
  65. pos[v[i][j].second][v[i][j].first]=cn-1;
  66. }
  67. }
  68. knd[i]=cn-1;
  69. t[i].resize((cn+1)*4,0);
  70.  
  71. }
  72. for(int i=1;i<=n;++i){
  73. for(int j=1;j<=n;++j){
  74. if(hw[a[i][j]]<3)continue;
  75. int p=pos[i][j];
  76. int gn=a[i][j];
  77. int g=get(gn,0,p,1,0,knd[gn]);
  78. upd(gn,p,0,knd[gn],1,g+1);
  79. arj[i][j]=g+1;
  80. }
  81. }
  82. for(int i=1;i<=n*n;++i){
  83. if(hw[i]<3)continue;
  84. t[i].clear();
  85. t[i].resize((knd[i]+1)*4,0);
  86. }
  87. for(int i=n;i>=1;--i){
  88. for(int j=n;j>=1;--j){
  89. if(hw[a[i][j]]<3)continue;
  90. int p=pos[i][j];
  91. int gn=a[i][j];
  92. int g=get(gn,p,knd[gn],1,0,knd[gn]);
  93. arj[i][j]+=g;
  94. upd(gn,p,0,knd[gn],1,g+1);
  95. ++ans[arj[i][j]];
  96.  
  97. }
  98. }
  99. for(int i=1;i<n+n;++i){
  100. printf("%d ",ans[i]);
  101. }
  102. printf("\n");
  103. return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement