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

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 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);
	}
//	for(int i=1;i<=n*2;i++){
//		for(int j=1;j<=m*2;j++)cout<<F[i][j]<<" ";
//		cout<<endl;
//	}
	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){
			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])S.insert(vis[x_1+1][j]);
				if(!E[x_2][j]&&vis[x_2+1][j]==vis[x_2-1][j])S.insert(vis[x_2+1][j]);
			}
			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])S.insert(vis[j][y_1+1]);
				if(!E[j][y_2]&&vis[j][y_2-1]==vis[j][y_2+1])S.insert(vis[j][y_2+1]);
			}
		}
		now_F-=S.size();
		now_F=max(now_F,0ll);
//		cout<<"debug: "<<"V="<<V<<" now_F="<<now_F<<" now_E="<<now_E<<endl;
		cout<<V+now_F-now_E<<'\n';
	}
	return 0;
}
2024/9/13 16:02
加载中...