求助卡常
查看原帖
求助卡常
564883
sjr3065335594楼主2024/2/28 21:09

这份代码 80pts,TLE on 5、6、14、17,之前讨论区说到的都写了(除了钦定一个红色棋子在另一个的上方,有没有大佬教一教怎么做)

#include<bits/stdc++.h>
#define ll long long
#define mkp(x,y) make_pair(x,y)
#define CLR(a,x) memset(a,x,sizeof(a))
#define rep(i,a,b) for(register short i=(a);i<=(b);++i)
#define y1 Y1
#define il inline
//#define int long long
//#define int __int128
using namespace std;
const int N=15;
const int M=2e6+5;
const int INF=2e9+5;
short ID,t,n,m,sx1,sy1,sx2,sy2,sx3,sy3;char c[N][N];
int f[M],head[M],ind[M],num,cnt,start;
bitset<M>g,vis;
int id[N][N][N][N][N][N][2];
struct EDGE {
	int v,next;
}edge[M<<2];
il void add_edge(int x,int y) {
	edge[++cnt]=(EDGE){y,head[x]};
	head[x]=cnt;
}
short dx[]={-1,0,0,1};
short dy[]={0,1,-1,0};
il void Clear() {
	for(register int i=0;i<num;i++) {
		f[i]=g[i]=vis[i]=ind[i]=0;
		head[i]=-1;
	}
	sx1=sx2=sx3=sy1=sy2=sy3=0;
	num=cnt=0; 
}
il bool check(short x1,short y1,short x2,short y2,short x3,short y3) {
	if(x1>n||x1<1||y1>m||y1<1)return 0;
	if(x2>n||x2<1||y2>m||y2<1)return 0;
	if(x3>n||x3<1||y3>m||y3<1)return 0;
	if(x1==x2&&y1==y2)return 0;
	if(c[x1][y1]=='#'||
		c[x2][y2]=='#'||
		c[x3][y3]=='#')return 0;
	return 1;
}
il void BFS() {
	queue<int>q;
	for(int i=0;i<num;i++)
		if(vis[i])q.push(i);
	while(!q.empty()) {
		int u=q.front();q.pop();
		if(u==start)return;
		for(int i=head[u];~i;i=edge[i].next) {
			int v=edge[i].v;
			if(!vis[v]) {
				ind[v]--;
				if(!g[u]) {
					g[v]=1;f[v]=f[u]+1;
					vis[v]=1;
					q.push(v);
				} else if(!ind[v]) {
					g[v]=0;f[v]=f[u]+1;
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
}
il void init1() {
	rep(x1,1,n)rep(y1,1,m)rep(x2,1,n)rep(y2,1,m)rep(x3,1,n)rep(y3,1,m) {
		if(check(x1,y1,x2,y2,x3,y3))
			id[x1][y1][x2][y2][x3][y3][0]=num++,
			id[x1][y1][x2][y2][x3][y3][1]=num++;
	}
}
il void init2() {
	rep(x1,1,n)rep(y1,1,m)rep(x2,1,n)rep(y2,1,m)rep(x3,1,n)rep(y3,1,m) {
		if(!check(x1,y1,x2,y2,x3,y3))continue;
		int cur=id[x1][y1][x2][y2][x3][y3][0];
		rep(i,0,3) {
			short nx=x1+dx[i],ny=y1+dy[i];
			if(check(nx,ny,x2,y2,x3,y3)) {
				add_edge(id[nx][ny][x2][y2][x3][y3][1],cur);
				ind[cur]++;
			}
			nx=x2+dx[i],ny=y2+dy[i];
			if(check(x1,y1,nx,ny,x3,y3)) {
				add_edge(id[x1][y1][nx][ny][x3][y3][1],cur);
				ind[cur]++;
			}
		}
		rep(i,0,2) {
			short nx=x3+dx[i],ny=y3+dy[i];
			if(check(x1,y1,x2,y2,nx,ny)) {
				add_edge(id[x1][y1][x2][y2][nx][ny][0],cur^1);
				ind[cur^1]++;
			}
		}
		if(x3==1) {
			vis[cur]=vis[cur^1]=1;
			g[cur]=0;g[cur^1]=1;
			f[cur]=f[cur^1]=0;
		} else if((x1==x3&&y1==y3)||(x2==x3&&y2==y3)) {
			vis[cur]=vis[cur^1]=1;
			g[cur]=g[cur^1]=0;
			f[cur]=f[cur^1]=0;
		} else  {
			if(!ind[cur])vis[cur]=1,g[cur]=f[cur]=0;
			if(!ind[cur^1])vis[cur^1]=1,g[cur^1]=f[cur^1]=0;
		}
	}
}
il void solve() {
	cin>>n>>m;
	rep(i,1,n)cin>>(c[i]+1);
	rep(i,1,n)rep(j,1,m) {
		if(c[i][j]=='X')sx3=i,sy3=j;
		if(c[i][j]=='O') {
			if(sx1==0&&sy1==0)sx1=i,sy1=j;
			else sx2=i,sy2=j;
		}
	}	
	init1();
	init2();
	start=id[sx1][sy1][sx2][sy2][sx3][sy3][0];
	BFS();
	if(!vis[start])cout<<"Tie"<<endl;
	else if(g[start])cout<<"Red "<<f[start]<<endl;
	else cout<<"Black "<<f[start]<<endl;
	Clear();
}
int main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>ID>>t;
	CLR(head,-1);
	while(t--)
		solve();
	return 0;
}
2024/2/28 21:09
加载中...