40ptsWA 求调
查看原帖
40ptsWA 求调
685964
shuqiang楼主2024/10/20 12:36

ai,j=0a_{i,j}=0 表示空地,ai,j=1a_{i,j}=1 表示湖泊,ai,j=2a_{i,j}=2 表示树,ai,j=3a_{i,j}=3 表示周围有湖泊。

#include<iostream>

using namespace std;

const int N = 3010, M = 1e5 + 10;
int n, m, q, r, k, x1, y1, x2, y2, a[N][N], t[M], x[M], y[M];

void check_die(int x, int y){
	if(a[x][y] != 2) return;
	bool b1 = 0;
	if(a[x+1][y] == 2 || a[x+1][y] == 3) b1 = 1;
	if(a[x-1][y] == 2 || a[x-1][y] == 3) b1 = 1;
	if(a[x][y+1] == 2 || a[x][y+1] == 3) b1 = 1;
	if(a[x][y-1] == 2 || a[x][y-1] == 3) b1 = 1;
	if(!b1) a[x][y] = 0;
	if(a[x][y] == 0 && (a[x+1][y] == 1 || a[x][y+1] == 1 || a[x-1][y] == 1 || a[x][y-1] == 1)) a[x][y] = 3;
}

void check_plant(int x, int y){
	if(a[x][y] == 3 && (a[x+1][y] == 2 || a[x][y+1] == 2 || a[x-1][y] == 2 || a[x][y-1] == 2)) a[x][y] = 2;
	if(a[x][y] == 2){
		if(a[x+1][y] == 3) check_plant(x+1, y);
		if(a[x][y+1] == 3) check_plant(x, y+1);
		if(a[x-1][y] == 3) check_plant(x-1, y);
		if(a[x][y-1] == 3) check_plant(x, y-1);
	}
}

int main(){
	cin >> n >> m >> q >> r >> k;
	for(int i = 0; i < q; i++){
		cin >> x1 >> y1 >> x2 >> y2;
		for(int dx = x1; dx <= x2; dx++){
			for(int dy = y1; dy <= y2; dy++){
				a[dx][dy] = 1;
			}
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			if(a[i][j] == 0 && (a[i+1][j] == 1 || a[i][j+1] == 1 || a[i-1][j] == 1 || a[i][j-1] == 1)) a[i][j] = 3;
		}
	}
	for(int i = 0; i < r; i++) cin >> t[i] >> x[i] >> y[i];
	int l = 0;
	for(int i = 0; i < r; i++){
		if(a[x[i]][y[i]] != 1) a[x[i]][y[i]] = 2;
		while(l < r && t[i] - t[l] >= k){
			check_die(x[l], y[l]);
			l++;
		}
	}
	while(l < r){
		check_die(x[l], y[l]);
		l++;
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			if(a[i][j] == 3) check_plant(i, j);
		}
	}
	int ans = 0;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			ans += (a[i][j] == 2); 
		}
	}
	cout << ans;
	return 0;
}

2024/10/20 12:36
加载中...