95 pts RE#1 求调
查看原帖
95 pts RE#1 求调
789564
queenbee楼主2024/10/20 18:50
#include<bits/stdc++.h>
using namespace std;
const int N=3e3+10;
const int K=9e6+10;
const int M=-1e9;
#define int long long
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int n,m,q,r,k;
int t;
struct Node{
	int t,x,y;
}pos[K];
int f[N][N],vis[N][N],wl[N][N];
int sum[K],cnt;
int viss[K];
int a1,a2,b1,b2;
int ans;
void dfs(int x,int y,int s){
	f[x][y]=s;
	sum[s]++;
	vis[x][y]=1;
	for(int i=0;i<=3;i++){
		if(f[x+dx[i]][y+dy[i]]==1&&!vis[x+dx[i]][y+dy[i]]){
			dfs(x+dx[i],y+dy[i],s);
		}
	}
} 
void plant(int x,int y,int t){
	if(f[x][y]!=0&&f[x][y]<-M){
		wl[x][y]=1;
		if(!viss[f[x][y]]){
			ans+=sum[f[x][y]]-1;
			viss[f[x][y]]=1;
		}
		f[x][y]=t-M;
		return;
	}
	f[x][y]=t-M;
	for(int i=0;i<=3;i++){
		if(x+dx[i]<=n&&x+dx[i]>=1&&y+dy[i]<=m&&y+dy[i]>=1&&f[x+dx[i]][y+dy[i]]!=0){
			if(f[x+dx[i]][y+dy[i]]>=-M){
				if(f[x][y]-f[x+dx[i]][y+dy[i]]<=k||wl[x+dx[i]][y+dy[i]]){
					wl[x][y]=1;
					wl[x+dx[i]][y+dy[i]]=1;
				}
				continue;
			}
			else if(!viss[f[x+dx[i]][y+dy[i]]]){
				wl[x][y]=1;
				viss[f[x+dx[i]][y+dy[i]]]=1;
				ans+=sum[f[x+dx[i]][y+dy[i]]];
			}
			else{
				wl[x][y]=1;
			}
		}
	}
}
signed main(){
//	freopen("lake5.in","r",stdin);
	scanf("%lld%lld%lld%lld%lld",&n,&m,&q,&r,&k);
	for(int i=1;i<=q;i++){
		scanf("%lld%lld%lld%lld",&a1,&b1,&a2,&b2);
		f[a1][b1]=M;
		f[a2+1][b1]=-M;
		f[a1][b2+1]=-M;
		f[a2+1][b2+1]=M; 
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(f[i][j]==M){
				for(int k=0;k<=3;k++){
					if(i+dx[k]<=n&&i+dx[k]>=1&&j+dy[k]<=m&&j+dy[k]>=1&&f[i+dx[k]][j+dy[k]]!=M){
						f[i+dx[k]][j+dy[k]]=1;
					}
				}
			}
		} 
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(f[i][j]==1&&!vis[i][j]){
				cnt++;
				dfs(i,j,cnt);
			}
		}
	}
	for(int i=1;i<=r;i++){
		scanf("%lld%lld%lld",&pos[i].t,&pos[i].x,&pos[i].y);
		plant(pos[i].x,pos[i].y,pos[i].t);
	}
	for(int i=1;i<=r;i++){
		if(wl[pos[i].x][pos[i].y]&&f[pos[i].x][pos[i].y]==pos[i].t-M){
			ans++;
		}
	}
	printf("%lld",ans);
	return 0;
}
2024/10/20 18:50
加载中...