社区讨论
考场代码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 条回复,欢迎继续交流。
正在加载回复...