Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- ifstream fin ("minecraft.in");
- ofstream fout ("minecraft.out");
- long long sumG(long long x,long long y)
- {
- return y*(y+1)/2-x*(x-1)/2;
- }
- int c,n;
- int a[1002][1002],st[1002],dr[1002];
- long long cost[1002][1002],sum[1002][1002];
- short lin[1002][1002],col[1002][1002],lat[1002][1002];
- bool v[1002][1002],viz[1002][1002];
- char ch;
- int dl[4]={0, 0, -1,1};
- int dc[4]={1, -1, 0,0};
- bool in(int i,int j)
- {
- if(i>=1&&i<=n&&j>=1&&j<=n)
- return 1;
- else
- return 0;
- }
- bool ok(int i,int j)
- {
- int l=lat[i][j];
- if(i<n&&lin[i+1][j]-lin[i+1][j-l]!=l)
- return 1;
- if(i>l&&lin[i-l][j]-lin[i-l][j-l]!=l)
- return 1;
- if(j<n&&col[j+1][i]-col[j+1][i-l]!=l)
- return 1;
- if(i>l&&col[j-l][i]-col[j-l][i-l]!=l)
- return 1;
- return 0;
- }
- int main()
- {
- cin>>c>>n;
- for(int i=1;i<=n;++i)
- {
- for(int j=1;j<=n;++j)
- {
- char ch;
- cin>>ch;
- if(ch=='V')
- v[i][j]=1;
- else
- v[i][j]=0;
- lin[i][j]=v[i][j]+lin[i][j-1];
- col[j][i]=v[i][j]+col[j][i-1];
- if(v[i][j])
- a[i][j]=a[i-1][j]+1;
- else
- a[i][j]=0;
- }
- }
- if(c==2)
- {
- queue<pair<int,int>>Q;
- for(int i=1;i<=n;++i)
- for(int j=1;j<=n;++j)
- if(!v[i][j])
- {
- Q.push({i,j});
- viz[i][j]=1;
- }
- while(!Q.empty())
- {
- int i=Q.front().first,j=Q.front().second;
- Q.pop();
- for(int k=0;k<4;++k)
- {
- int ii=i+dl[k],jj=j+dc[k];
- if(in(ii,jj)&&!viz[ii][jj])
- {
- cost[ii][jj]=1+cost[i][j];
- viz[ii][jj]=1;
- Q.push({ii,jj});
- }
- }
- }
- short Max=0;
- long long Min=1e18;
- for(int i=1;i<=n;++i)
- for(int j=1;j<=n;++j)
- sum[i][j]=cost[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
- for(int i=1;i<=n;++i)
- for(int j=1;j<=n;++j)
- {
- if(v[i][j]==1)
- lat[i][j]=min(lat[i-1][j-1],min(lat[i][j-1],lat[i-1][j]))+1;
- else
- lat[i][j]=0;
- int l=lat[i][j];
- if(ok(i,j))
- {
- if(Max<lat[i][j])
- {
- Max=lat[i][j];
- Min=sum[i][j]-sum[i][j-l]-sum[i-l][j]+sum[i-l][j-l];
- }
- else
- if(Max==lat[i][j])
- if(Min>sum[i][j]-sum[i][j-l]-sum[i-l][j]+sum[i-l][j-l])
- Min=sum[i][j]-sum[i][j-l]-sum[i-l][j]+sum[i-l][j-l];
- }
- }
- cout<<(int)Max*Max<<' '<<Min;
- }
- if(c==1)
- {
- long long ans=0;
- for(int i=1;i<=n;++i)
- for(int j=1;j<=n;++j)
- ans+=i*j;
- for(int i=1;i<=n;++i)
- {
- stack<int>S;
- S.push(0);
- for(int j=1;j<=n;++j)
- {
- while(!S.empty()&&a[i][S.top()]>a[i][j])
- S.pop();
- if(a[i][j]==0)
- {
- st[j]=0;
- S.push(0);
- }
- else
- {
- st[j]=S.top();
- }
- S.push(j);
- }
- while(!S.empty())
- S.pop();
- S.push(n+1);
- for(int j=n;j>=1;--j)
- {
- while(!S.empty()&&a[i][S.top()]>=a[i][j])
- S.pop();
- if(a[i][j]==0)
- {
- dr[j]=0;
- S.push(0);
- }
- else
- {
- dr[j]=S.top();
- }
- S.push(j);
- }
- for(int j=1;j<=n;++j)
- {
- int start=st[j]+1;
- int end=dr[j]-1;
- long long Int=(j-start+1)*(end-j+1);
- ans-=1ll*a[i][j]*Int;
- }
- }
- cout<<ans;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement