求调
查看原帖
求调
482163
emo_zkt楼主2024/10/22 00:16

95pts,MLE一个点,求助,orz

#include<bits/stdc++.h>
using namespace std;
const int INF=2e9+10;
int n,m,q,r,k,a[3005][3005],cnt,d[3005][3005],g[3005][3005];
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
queue<pair<int,int> >p;
void bfs(int x,int y){
	p.push({x,y});
	while(!p.empty()){
		pair<int,int> u=p.front();
		p.pop();
		for(int i=0;i<4;i++){
			int xx=u.first+dx[i],yy=u.second+dy[i];
			if(xx<1||xx>n||yy<1||yy>m)continue;
			if(g[xx][yy]==0&&a[xx][yy]==2){
				g[xx][yy]=g[x][y]+1;
				d[xx][yy]=INF;
				bfs(xx,yy);
			}
			if(g[x][y]<=d[xx][yy])d[xx][yy]=d[x][y]=INF;
		}
	}
}
int main(){
	cin>>n>>m>>q>>r>>k;
	while(q--){
		int a1,b1,a2,b2;
		cin>>a1>>b1>>a2>>b2;
		for(int i=a1;i<=a2;i++)
			for(int j=b1;j<=b2;j++)a[i][j]=1;
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(a[i][j]==1)continue;
			for(int k=0;k<4;k++){
				int xx=i+dx[k],yy=j+dy[k];
				if(a[xx][yy]==1&&a[i][j]==0){
					a[i][j]=2;
					break;
				}
			}
		}
	while(r--){
		int t,x,y;
		cin>>t>>x>>y;
		g[x][y]=t;
		if(a[x][y]==0)d[x][y]=t+k;
		if(a[x][y]==2)d[x][y]=INF;
		bfs(x,y);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(d[i][j]==INF)cnt++;
		}
	}
	cout<<cnt;
	return 0;
}
2024/10/22 00:16
加载中...