(玄关)萌新刚学OI1ms,求条黄题
查看原帖
(玄关)萌新刚学OI1ms,求条黄题
822439
lhz2022楼主2024/12/25 22:56
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define debug() puts("I WILL AK")
#define N 1007
#define M 200007
int mp[N][N],vis[N][N];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
struct cng{
	int x,y;
	char op;
}p[M];
int ans[M],ans0;
int n,m;
inline int get(int x,int y){
	return (x-1)*n+y;
}
struct node{
	int x,y;
};
vector<node> g[N];
node que[N*N];
int ll=1,rr=0;
inline void add(int x,int y){
	if(mp[x][y]=='U'){
		if(x==1) vis[x][y]=1,que[++rr]={x,y};
	}
	else if(mp[x][y]=='D'){
		if(x==n) vis[x][y]=1,que[++rr]={x,y};
	}
	else if(mp[x][y]=='L'){
		if(y==1) vis[x][y]=1,que[++rr]={x,y};
	}
	else if(mp[x][y]=='R'){
		if(y==n) vis[x][y]=1,que[++rr]={x,y};
	}
	else if(mp[x][y]=='?'){
		if(y==1||y==n||x==1||x==n) que[++rr]={x,y},vis[x][y]=1;
	}
}
void bfs(){
	while(ll<=rr){
		auto u=que[ll++];
		//cout<<u.x<<' '<<u.y<<'\n';
		ans0++;
		int x=u.x,y=u.y;
		vis[x][y]=1;
		for(int i=0;i<4;++i){
			int xx=x+dx[i],yy=y+dy[i];
			if(dx[i]==0&&dy[i]==1&&!vis[xx][yy]&&xx>=1&&xx<=n&&yy>=1&&yy<=n&&(mp[xx][yy]=='L'||mp[xx][yy]=='?')){
				que[++rr]={xx,yy};
				vis[xx][yy]=1;
				//cout<<"add"<<xx<<' '<<yy<<'\n';
			}
			else if(dx[i]==0&&dy[i]==-1&&!vis[xx][yy]&&xx>=1&&xx<=n&&yy>=1&&yy<=n&&(mp[xx][yy]=='R'||mp[xx][yy]=='?')){
				que[++rr]={xx,yy};
				vis[xx][yy]=1;
				//cout<<"add"<<xx<<' '<<yy<<'\n';
			}
			else if(dx[i]==-1&&dy[i]==0&&!vis[xx][yy]&&xx>=1&&xx<=n&&yy>=1&&yy<=n&&(mp[xx][yy]=='D'||mp[xx][yy]=='?')){
				que[++rr]={xx,yy};
				vis[xx][yy]=1;
				//cout<<"add"<<xx<<' '<<yy<<'\n';
			}
			else if(dx[i]==1&&dy[i]==0&&!vis[xx][yy]&&xx>=1&&xx<=n&&yy>=1&&yy<=n&&(mp[xx][yy]=='U'||mp[xx][yy]=='?')){
				que[++rr]={xx,yy};
				vis[xx][yy]=1;
				//cout<<"add"<<xx<<' '<<yy<<'\n';
			}
		}
	}
	//debug();
}

signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;++i){
		cin>>p[i].x>>p[i].y>>p[i].op;
		mp[p[i].x][p[i].y]=p[i].op;
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			if(!mp[i][j]) mp[i][j]='?';
			add(i,j);
		}
	}
	//for(int i=ll;i<=rr;++i){
	//	cout<<que[i].x<<' '<<que[i].y<<'\n';
	//}
	//debug();
	bfs();
	ans[m]=n*n-ans0;
	for(int i=m;i>=1;--i){
		ll=1,rr=0;
		mp[p[i].x][p[i].y]='?';
		//cout<<"make"<<p[i].x<<' '<<p[i].y<<'\n';
		if(!vis[p[i].x][p[i].y]) que[++rr]={p[i].x,p[i].y};
		bfs();
		ans[i-1]=n*n-ans0;
	}
	for(int i=1;i<=m;++i){
		cout<<ans[i]<<'\n';
	}
	return 0;
}
2024/12/25 22:56
加载中...