Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34861 | baka24 | 【S】T3 | C++ | 解答错误 | 81 | 79 MS | 62932 KB | 2802 | 2024-11-19 15:46:09 |
#include<bits/stdc++.h> using namespace std; #define int long long #define it __int128 #define popcnt __builtin_popcount #define pii pair<int,int> #define fr first #define sc second #define pb push_back #define mk make_pair int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=1010,N=20; int n,m,ans,sum,num,a[MAXN][MAXN],vis[MAXN][MAXN],fa[MAXN*MAXN],cnt; int mx[4]={1,-1,0,0},my[4]={0,0,1,-1}; map<pii,int>P,Q; void dfs(int t,int x,int y){ vis[x][y]=t; for(int i=0;i<4;i++){ int nx=x+mx[i],ny=y+my[i]; if(nx&&ny&&nx<=n&&ny<=m&&!vis[nx][ny]&&!a[nx][ny])dfs(t,nx,ny); } } int check(int x,int y){ bool fl1=0,fl2=0; for(int i=0;i<4;i++){ int nx=x+mx[i],ny=y+my[i]; if(nx&&ny&&nx<=n&&ny<=m)fl1|=vis[nx][ny]==vis[1][1],fl2|=vis[nx][ny]==vis[n][m]; } return fl1&&fl2; } int p[MAXN],q[MAXN]; int check1(int x,int y){ bool fl1=0,fl2=0; vector<int>G; for(int i=0;i<4;i++){ int nx=x+mx[i],ny=y+my[i]; if(nx&&ny&&nx<=n&&ny<=m&&vis[nx][ny])fl1|=vis[nx][ny]==vis[1][1],fl2|=vis[nx][ny]==vis[n][m],G.pb(vis[nx][ny]); } if(fl1&&fl2){num++;return (sum-num)*2;} else if(fl1||fl2){ int res=0; pii tmp=mk(0,0); sort(G.begin(),G.end()); G.erase(unique(G.begin(),G.end()),G.end()); for(auto o:G)if(o!=vis[1][1]&&o!=vis[n][m]){ if(fl1)res+=q[o];else res+=p[o]; if(tmp.fr)tmp.sc=o;else tmp.fr=o; } if(tmp.sc>tmp.fr)swap(tmp.sc,tmp.fr); if(tmp.fr&&tmp.sc){if(fl1)res-=Q[tmp],P[tmp]++;else res-=P[tmp],Q[tmp]++;} for(auto o:G)if(o!=vis[1][1]&&o!=vis[n][m])if(fl1)p[o]++;else q[o]++; res*=2; if(fl1)vis[x][y]=vis[1][1]; else vis[x][y]=vis[n][m]; for(int i=0;i<4;i++){ int nx=x+mx[i],ny=y+my[i]; if(nx&&ny&&nx<=n&&ny<=m&&a[nx][ny])if(check(nx,ny))res++; } vis[x][y]=0; for(int i=0;i<4;i++){ int nx=x+mx[i],ny=y+my[i]; if(nx&&ny&&nx<=n&&ny<=m&&a[nx][ny])if(check(nx,ny))res--; } return res; } else return 0; } void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ char c=getchar();while(c!='.'&&c!='#')c=getchar(); a[i][j]=c=='#'; sum+=a[i][j]; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++)if(!a[i][j]&&!vis[i][j])dfs(++cnt,i,j); } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)if(a[i][j]){ ans+=check1(i,j); } printf("%lld",ans/2); } signed main(){ slv(); return 0; }