关于我第一次碰到UKE这件事
查看原帖
关于我第一次碰到UKE这件事
1041850
chenjunnan楼主2025/8/4 09:23

看了@紫题dalao的爆搜方法才敢写的(蒟蒻第一次碰黑题...)
我自己测的时候会莫名RE但交给洛谷就是UKE(黑题出黑色评测结果很正常吧
一连UKE了5次了不知道为什么...
难道是评测机直接把爆搜类的代码ban了?

附一份自评RE洛谷UKE代码:

#include<bits/stdc++.h>
#define ll long long
#define f(i,a,b,n) for(int i=a;i<=b;i+=n)
#define ff(i,a,b,n) for(int i=a;i>=b;i-=n)
#define fv(i,m) for(int i=0;i<m.size();i++)
#define fb(i,m) for(int i=m;i;i-=i&(-i))
#define gm(a,b) a=max(a,b)
#define ms(a,b) memset(a,b,sizeof(a))
#define mc(a,b) memcpy(a,b,sizeof(b))
#define mp(a,b) make_pair(a,b)
using namespace std;
char sudo[16][16];
int K,space,wcip[16][16],p[17],wa[3][16],number[37],ans[16][16],v[3][16][16];
vector<pair<int,int> > acan[3][16][16],rd[3][16];
int num(int x){
	int y=0;
	fb(i,x) y++;
	return y;
}
void write(int x,int y,int c){
	ans[x][y]=c;
	f(o,0,2,1) f(i,0,15,1){
		pair<int,int> xm=rd[o][v[o][x][y]][i];
		if(wcip[xm.first][xm.second]&p[c]) wcip[xm.first][xm.second]-=p[c];
	}
}
bool dfs(int step){
	if(step>space) return true;
	int nwcip[16][16],minn=INT_MAX,qx,qy;
	mc(nwcip,wcip);
	f(i,0,2,1) f(j,0,15,1) wa[i][j]=(1<<17)-2;
	f(i,0,3,1) f(j,0,15,1) f(k,0,15,1) acan[i][j][k].clear();
	f(i,0,15,1) f(j,0,15,1)
		if(ans[i][j]) f(o,0,2,1) wa[o][v[o][i][j]]-=p[ans[i][j]];
		else{
			int nm=num(wcip[i][j]);
			if(nm==0) return false;
			if(nm==1){
				write(i,j,number[wcip[i][j]%37]);
				if(dfs(step+1)) return true;
				mc(wcip,nwcip);
				ans[i][j]=0;
				return false;
			}
			fb(m,wcip[i][j]){
				int r=number[(m&(-m))%37];
				f(o,0,2,1) acan[o][v[o][i][j]][r].push_back(mp(i,j));
			}
			if(nm<minn) qx=i,qy=j,minn=nm;
		}
	f(o,0,2,1) f(i,0,15,1) fb(m,wa[o][i]){
		int r=number[(m&(-m))%37],l=acan[o][i][r].size();
		if(l==0) return false;
		pair<int,int> xm=acan[o][i][r][0];
		if(l==1){
			write(xm.first,xm.second,r);
			if(dfs(step+1)) return true;
			mc(wcip,nwcip);
			ans[xm.first][xm.second]=0;
			return false;
		}
	}
	fb(m,wcip[qx][qy]){
		int r=number[(m&(-m))%37];
		write(qx,qy,r);
		if(dfs(step+1)) return true;
		mc(wcip,nwcip);
		ans[qx][qy]=0;
	}
	return false;
}
int main(){
	scanf("%d",&K);
	f(i,0,16,1) p[i]=1<<i;
	f(i,0,36,1) number[(1<<i)%37]=i;
	f(i,0,15,1) f(j,0,15,1){
		v[0][i][j]=i;v[1][i][j]=j;v[2][i][j]=i/4*4+j/4;
		rd[0][i].push_back(mp(i,j));rd[1][j].push_back(mp(i,j));
		rd[2][i/4*4+j/4].push_back(mp(i,j));
	}
	while(K--){
		space=0;
		ms(ans,0);
		getchar();
		f(i,0,15,1) cin.getline(sudo[i],20);
		f(i,0,15,1) f(j,0,15,1) wcip[i][j]=(1<<17)-2;
		f(i,0,15,1) f(j,0,15,1)
			if(sudo[i][j]=='-') space++;
			else write(i,j,sudo[i][j]-'A'+1);
		dfs(1);
		f(i,0,15,1){
			f(j,0,15,1) printf("%c",ans[i][j]+'A'-1);
			printf("\n");
		}
		printf("\n");
	}
	return 0;
}
2025/8/4 09:23
加载中...