求助35pts
查看原帖
求助35pts
252549
Iwara楼主2024/9/13 16:40

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=2.5e3+5;
ll n,m;
char mp[MAXN][MAXN]; 
ll vis[MAXN][MAXN],cnt;
ll F[MAXN][MAXN];
bool E[MAXN][MAXN];
ll sum_E[MAXN][MAXN];
ll q;
ll x_1,y_1,x_2,y_2;
ll dx[4]={-2,0,0,2},dy[4]={0,-2,2,0};
bool fail[MAXN];
bool dfs(ll now_x,ll now_y){
	if(now_x<2||now_x>=2*n||now_y<2||now_y>=2*m)return 0;
	if(vis[now_x][now_y])return 1;
	vis[now_x][now_y]=cnt;
	bool res=1;
	for(int i=0;i<4;i++)if(!E[now_x+dx[i]/2][now_y+dy[i]/2])res&=dfs(now_x+dx[i],now_y+dy[i]);
	return res;
}
set<ll> S;
int main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n*2;i+=2)for(int j=1;j<=m*2;j+=2)cin>>mp[i][j];
	for(int i=1;i<=n*2;i+=2)for(int j=1;j<=m*2;j+=2){
		if(mp[i][j]==mp[i+2][j])E[i+1][j]=1;
		if(mp[i][j]==mp[i][j+2])E[i][j+1]=1;
	}
	for(int i=1;i<=n*2;i++)for(int j=1;j<=m*2;j++)sum_E[i][j]=sum_E[i-1][j]+sum_E[i][j-1]-sum_E[i-1][j-1]+E[i][j];
	for(int i=2;i<n*2;i+=2)for(int j=2;j<m*2;j+=2)if(!vis[i][j]){
		cnt++;
		F[i][j]=dfs(i,j);
		if(F[i][j]==0)fail[cnt]=1;
	}
	for(int i=2;i<=n*2;i++)for(int j=1;j<=m*2;j++)F[i][j]=F[i-1][j]+F[i][j-1]-F[i-1][j-1]+F[i][j]; 
	for(int i=1;i<=q;i++){
		cin>>x_1>>y_1>>x_2>>y_2;
		ll V=(x_2-x_1+1)*(y_2-y_1+1);
		x_1=1+(x_1-1)*2;
		x_2=1+(x_2-1)*2;
		y_1=1+(y_1-1)*2;
		y_2=1+(y_2-1)*2;
		ll now_E=sum_E[x_2][y_2]-sum_E[x_2][y_1-1]-sum_E[x_1-1][y_2]+sum_E[x_1-1][y_1-1];
		ll now_F=F[x_2][y_2]-F[x_2][y_1-1]-F[x_1-1][y_2]+F[x_1-1][y_1-1];
		S.clear();
		if(x_1!=x_2&&y_1!=y_2){
			bool fl=0;
			for(int j=y_1+1;j<=y_2;j+=2){
				if(!E[x_1][j]&&vis[x_1+1][j]==vis[x_1-1][j]&&!fail[vis[x_1+1][j]])S.insert(vis[x_1+1][j]);
				else if(!E[x_2][j]&&vis[x_2+1][j]==vis[x_2-1][j]&&!fail[vis[x_2+1][j]])S.insert(vis[x_2+1][j]);
				else fl=1;
			}
			for(int j=x_1+1;j<=x_2;j+=2){
				if(!E[j][y_1]&&vis[j][y_1-1]==vis[j][y_1+1]&&!fail[vis[j][y_1+1]])S.insert(vis[j][y_1+1]);
				else if(!E[j][y_2]&&vis[j][y_2-1]==vis[j][y_2+1]&&!fail[vis[j][y_2+1]])S.insert(vis[j][y_2+1]);
				else fl=1;
			}
			now_F-=S.size();
			if(fl==0)now_F++;
		}
//		cout<<"debug: "<<"V="<<V<<" now_F="<<now_F<<" now_E="<<now_E<<endl;
		cout<<V+now_F-now_E<<'\n';
	}
	return 0;
}

不知道哪个细节没注意到/kk

2024/9/13 16:40
加载中...