Advertisement
a53

minecraft

a53
Apr 21st, 2019
4,060
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.39 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. ifstream fin ("minecraft.in");
  4. ofstream fout ("minecraft.out");
  5.  
  6. long long sumG(long long x,long long y)
  7. {
  8. return y*(y+1)/2-x*(x-1)/2;
  9. }
  10.  
  11. int c,n;
  12. int a[1002][1002],st[1002],dr[1002];
  13. long long cost[1002][1002],sum[1002][1002];
  14. short lin[1002][1002],col[1002][1002],lat[1002][1002];
  15. bool v[1002][1002],viz[1002][1002];
  16. char ch;
  17. int dl[4]={0, 0, -1,1};
  18. int dc[4]={1, -1, 0,0};
  19.  
  20. bool in(int i,int j)
  21. {
  22. if(i>=1&&i<=n&&j>=1&&j<=n)
  23. return 1;
  24. else
  25. return 0;
  26. }
  27.  
  28. bool ok(int i,int j)
  29. {
  30. int l=lat[i][j];
  31. if(i<n&&lin[i+1][j]-lin[i+1][j-l]!=l)
  32. return 1;
  33. if(i>l&&lin[i-l][j]-lin[i-l][j-l]!=l)
  34. return 1;
  35. if(j<n&&col[j+1][i]-col[j+1][i-l]!=l)
  36. return 1;
  37. if(i>l&&col[j-l][i]-col[j-l][i-l]!=l)
  38. return 1;
  39. return 0;
  40. }
  41.  
  42. int main()
  43. {
  44. cin>>c>>n;
  45. for(int i=1;i<=n;++i)
  46. {
  47. for(int j=1;j<=n;++j)
  48. {
  49. char ch;
  50. cin>>ch;
  51. if(ch=='V')
  52. v[i][j]=1;
  53. else
  54. v[i][j]=0;
  55. lin[i][j]=v[i][j]+lin[i][j-1];
  56. col[j][i]=v[i][j]+col[j][i-1];
  57. if(v[i][j])
  58. a[i][j]=a[i-1][j]+1;
  59. else
  60. a[i][j]=0;
  61. }
  62. }
  63. if(c==2)
  64. {
  65. queue<pair<int,int>>Q;
  66. for(int i=1;i<=n;++i)
  67. for(int j=1;j<=n;++j)
  68. if(!v[i][j])
  69. {
  70. Q.push({i,j});
  71. viz[i][j]=1;
  72. }
  73. while(!Q.empty())
  74. {
  75. int i=Q.front().first,j=Q.front().second;
  76. Q.pop();
  77. for(int k=0;k<4;++k)
  78. {
  79. int ii=i+dl[k],jj=j+dc[k];
  80. if(in(ii,jj)&&!viz[ii][jj])
  81. {
  82. cost[ii][jj]=1+cost[i][j];
  83. viz[ii][jj]=1;
  84. Q.push({ii,jj});
  85. }
  86. }
  87. }
  88. short Max=0;
  89. long long Min=1e18;
  90. for(int i=1;i<=n;++i)
  91. for(int j=1;j<=n;++j)
  92. sum[i][j]=cost[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
  93. for(int i=1;i<=n;++i)
  94. for(int j=1;j<=n;++j)
  95. {
  96. if(v[i][j]==1)
  97. lat[i][j]=min(lat[i-1][j-1],min(lat[i][j-1],lat[i-1][j]))+1;
  98. else
  99. lat[i][j]=0;
  100. int l=lat[i][j];
  101. if(ok(i,j))
  102. {
  103. if(Max<lat[i][j])
  104. {
  105. Max=lat[i][j];
  106. Min=sum[i][j]-sum[i][j-l]-sum[i-l][j]+sum[i-l][j-l];
  107. }
  108. else
  109. if(Max==lat[i][j])
  110. if(Min>sum[i][j]-sum[i][j-l]-sum[i-l][j]+sum[i-l][j-l])
  111. Min=sum[i][j]-sum[i][j-l]-sum[i-l][j]+sum[i-l][j-l];
  112. }
  113. }
  114. cout<<(int)Max*Max<<' '<<Min;
  115. }
  116. if(c==1)
  117. {
  118. long long ans=0;
  119. for(int i=1;i<=n;++i)
  120. for(int j=1;j<=n;++j)
  121. ans+=i*j;
  122. for(int i=1;i<=n;++i)
  123. {
  124. stack<int>S;
  125. S.push(0);
  126. for(int j=1;j<=n;++j)
  127. {
  128. while(!S.empty()&&a[i][S.top()]>a[i][j])
  129. S.pop();
  130. if(a[i][j]==0)
  131. {
  132. st[j]=0;
  133. S.push(0);
  134. }
  135. else
  136. {
  137. st[j]=S.top();
  138. }
  139. S.push(j);
  140. }
  141. while(!S.empty())
  142. S.pop();
  143. S.push(n+1);
  144. for(int j=n;j>=1;--j)
  145. {
  146. while(!S.empty()&&a[i][S.top()]>=a[i][j])
  147. S.pop();
  148. if(a[i][j]==0)
  149. {
  150. dr[j]=0;
  151. S.push(0);
  152. }
  153. else
  154. {
  155. dr[j]=S.top();
  156. }
  157. S.push(j);
  158. }
  159. for(int j=1;j<=n;++j)
  160. {
  161. int start=st[j]+1;
  162. int end=dr[j]-1;
  163. long long Int=(j-start+1)*(end-j+1);
  164. ans-=1ll*a[i][j]*Int;
  165. }
  166. }
  167. cout<<ans;
  168. }
  169. return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement