社区讨论

考场代码O(n^3m^3)拓扑为何过不去

P9169[省选联考 2023] 过河卒参与者 1已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo2po84g
此快照首次捕获于
2023/10/23 17:44
2 年前
此快照最后确认于
2023/10/23 17:44
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x*f;
}
void print(int x){
	if(x<0){putchar('-');print(-x);return;}
	if(x/10)print(x/10);
	putchar(x%10+48);
}
const int N=2e6+5;
char a[11][11];
int n,m,ans1[N],fl2[N],ans3[N],f[N],g[N],in[N],vis[N];
int dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
vector<int>G[N];
double GHA=0;
inline int gha(int x,int y,int ax,int ay,int bx,int by,int p){
	return p+2*(x-1+n*(y-1+m*(ax-1+n*(ay-1+m*(bx-1+n*(by-1)))))); 
}
void solve(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
	for(int i=n*n*n*m*m*m*2;i>=0;i--)ans1[i]=1e9,fl2[i]=0,ans3[i]=-1e9,f[i]=-1,g[i]=1e9,in[i]=vis[i]=0,G[i].clear();
	queue<int>Q;int x=0,y=0,ax=0,ay=0,bx=0,by=0;
	for(register int i=1;i<=n;i++)for(register int j=1;j<=m;j++)
		if(a[i][j]=='X')x=i,y=j;
		else if(a[i][j]=='O'){
			if(!ax)ax=i,ay=j;
			else bx=i,by=j;
		}
	int he=gha(x,y,ax,ay,bx,by,2);
	for(register int x=1;x<=n;x++)for(register int y=1;y<=m;y++)for(register int ax=1;ax<=n;ax++)for(register int ay=1;ay<=m;ay++)for(register int bx=1;bx<=n;bx++)for(register int by=1;by<=m;by++)for(register int p=1;p<=2;p++){
		bool oo=0;
		int Ha=gha(x,y,ax,ay,bx,by,p);
		if(p==1){
			for(register int i=0;i<3;i++){
				int nx=x+dx[i],ny=y+dy[i];
				if(nx<1||nx>n||ny<1||ny>m||a[nx][ny]=='#')continue;
				oo=1;
				G[gha(nx,ny,ax,ay,bx,by,3-p)].emplace_back(Ha),in[Ha]++;  
			}
		}
		else {
			for(register int i=0;i<4;i++){
				int nx=ax+dx[i],ny=ay+dy[i];
				if(nx<1||nx>n||ny<1||ny>m||a[nx][ny]=='#'||(nx==bx&&ny==by))continue;
				oo=1;
				G[gha(x,y,nx,ny,bx,by,3-p)].emplace_back(Ha),in[Ha]++; 
			}
			for(register int i=0;i<4;i++){
				int nx=bx+dx[i],ny=by+dy[i];
				if(nx<1||nx>n||ny<1||ny>m||a[nx][ny]=='#'||(nx==ax&&ny==ay))continue;
				oo=1;
				G[gha(x,y,ax,ay,nx,ny,3-p)].emplace_back(Ha),in[Ha]++;
			}
		}
		if(x==1||x==ax&&y==ay||x==bx&&y==by||!oo){
			int ha=gha(x,y,ax,ay,bx,by,p);
			f[ha]=3-p,g[ha]=0;
			Q.push(ha);
			vis[ha]=1;
			if(ha==he)goto yaya;
		}
	}
	while(!Q.empty()){
		int now=Q.front();Q.pop();
		int p=(now-1&1)+1;
		for(int y:G[now]){
			if(vis[y])continue;
			if(f[now]==3-p)ans1[y]=min(ans1[y],g[now]+1);
			else if(f[now]==p)ans3[y]=max(ans3[y],g[now]+1);
			else fl2[y]=1;
			if(!--in[y]){
				vis[y]=1;
				if(ans1[y]<1e9)f[y]=3-p,g[y]=ans1[y];
				else if(fl2[y])f[y]=0;
				else if(ans3[y]>-1e9)f[y]=p,g[y]=ans3[y];
				Q.push(y);
				if(y==he)goto yaya;
			}
			else if(ans1[y]!=1e9){
				vis[y]=1,f[y]=3-p,g[y]=g[now]+1,Q.push(y);
				if(y==he)goto yaya;
			}
		}
	}
	yaya:
	if(f[he]==2)printf("Red %d\n",g[he]);
	else if(f[he]==1)printf("Black %d\n",g[he]);
	else puts("Tie");
}
int main(){
	int tid=read(),T=read();
	while(T--)solve();
	return 0;
}//duo ce bu qing kong bao ling liang hang lei

回复

3 条回复,欢迎继续交流。

正在加载回复...