看了@紫题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;
}