ai,j=0 表示空地,ai,j=1 表示湖泊,ai,j=2 表示树,ai,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;
}