Advertisement
a53

cntSQ

a53
Jan 6th, 2019
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. ifstream f("cntsq.in");
  4. ofstream g("cntsq.out");
  5. int n,m,dp[1002][1002][4],aib[1002],t[1002];
  6. long long ans=0;
  7. vector<int>q[1002];
  8. char v[1002][1002];
  9.  
  10. void update (int x)
  11. {
  12. for(int i=x;i<=1000;i+=(i&-i))
  13. ++aib[i];
  14. }
  15.  
  16. int query(int x)
  17. {
  18. int sum=0;
  19. for(int i=x;i>0;i-=(i&-i))
  20. sum+=aib[i];
  21. return sum;
  22. }
  23.  
  24. int main()
  25. {
  26. f>>n>>m;
  27. for(int i=1;i<=n;++i)
  28. for(int j=1;j<=m;++j)
  29. f>>v[i][j];
  30. for(int i=1;i<=n;++i)
  31. for(int j=1;j<=m;++j)
  32. if(v[i][j]=='1')
  33. dp[i][j][0]=dp[i-1][j][0]+1,dp[i][j][1]=dp[i][j-1][1]+1,++ans;
  34. for(int i=n;i>=1;--i)
  35. for(int j=m;j>=1;--j)
  36. if(v[i][j]=='1')
  37. dp[i][j][2]=dp[i+1][j][2]+1,dp[i][j][3]=dp[i][j+1][3]+1;
  38. int nr=max(n,m);
  39. for(int j=1;j<=m;++j)
  40. {
  41. int i=1,jj=j;
  42. memset(aib,0,sizeof(aib));
  43. memset(t,0,sizeof(t));
  44. while(i<=n&&jj<=m)
  45. {
  46. if (v[i][jj]=='0')
  47. {
  48. ++i;++jj;
  49. continue;
  50. }
  51. t[i]=query(1000)-query(i-1);
  52. int aux=min(dp[i][jj][0],dp[i][jj][1]);
  53. int aux2=min(dp[i][jj][2],dp[i][jj][3]);
  54. q[i-aux].push_back(i);
  55. update(i+aux2-1);
  56. ++i,++jj;
  57. }
  58. memset(aib,0,sizeof(aib));
  59. i=1,jj=j;
  60. while(i<=n&&jj<=m)
  61. {
  62. int aux2=min(dp[i][jj][2],dp[i][jj][3]);
  63. if(v[i][jj]=='1')
  64. update(i+aux2-1);
  65. for(int k=0;k<(int)q[i].size();++k)
  66. t[q[i][k]]-=(query(1000)-query(q[i][k]-1));
  67. ++i;++jj;
  68. }
  69. for(int k=1;k<=nr;++k)
  70. ans+=t[k],q[k].clear();
  71. }
  72. for(int i=2;i<=n;++i)
  73. {
  74. int ii=i,j=1;
  75. memset(aib,0,sizeof(aib));
  76. memset(t,0,sizeof(t));
  77. while(ii<=n&&j<=m)
  78. {
  79. if(v[ii][j]=='0')
  80. {
  81. ++ii;++j;
  82. continue;
  83. }
  84. t[j]=query(1000)-query(j-1);
  85. int aux=min(dp[ii][j][0],dp[ii][j][1]);
  86. int aux2=min(dp[ii][j][2],dp[ii][j][3]);
  87. q[j-aux].push_back(j);
  88. update(j+aux2-1);
  89. ++ii,++j;
  90. }
  91. memset(aib,0,sizeof(aib));
  92. ii=i;j=1;
  93. while(ii<=n&&j<=m)
  94. {
  95. int aux2=min(dp[ii][j][2],dp[ii][j][3]);
  96. if(v[ii][j]=='1')
  97. update(j+aux2-1);
  98. for(int k=0;k<(int)q[j].size();++k)
  99. t[q[j][k]]-=(query(1000)-query(q[j][k]-1));
  100. ++ii;++j;
  101. }
  102. for(int k=1;k<=nr;++k)
  103. ans+=t[k],q[k].clear();
  104. }
  105. g<<ans;
  106. return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement