这是代码。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct node{
int l,r,u,d,x,y;
}a[N];
int tot;
int ansk[N],sum[N],cnt,h[N];
int nn;
int L,R;
struct edge{
int ans[20];
}ss[N];
bool cmp(edge i,edge j){
int k=1;
while(i.ans[k]==j.ans[k]){
k++;
}
return i.ans[k]<j.ans[k];
}
void add(int x,int y){
sum[y]++;
a[cnt].x=x;
a[cnt].y=y;
//------------
a[cnt].u=y;
a[cnt].d=a[y].d;
a[a[y].d].u=cnt;
a[y].d=cnt;
//-----------
if(h[x]<0) h[x]=a[cnt].r=a[cnt].l=cnt;
else{
a[cnt].r=h[x];
a[cnt].l=a[h[x]].l;
a[a[h[x]].l].r=cnt;
a[h[x]].l=cnt;
}
++cnt;
}
void del(int c){
a[a[c].l].r=a[c].r;
a[a[c].r].l=a[c].l;
for(int i=a[c].d;i!=c;i=a[i].d){
for(int j=a[i].r;j!=i;j=a[j].r){
a[a[j].u].d=a[j].d;
a[a[j].d].u=a[j].u;
sum[a[j].y]--;
}
}
}
void rev(int c){
a[a[c].l].r=c;
a[a[c].r].l=c;
for(int i=a[c].u;i!=c;i=a[i].u){
for(int j=a[i].l;j!=i;j=a[j].l){
a[a[j].u].d=j;
a[a[j].d].u=j;
sum[a[j].y]++;
}
}
}
void init(int m){
for(int i=0;i<=m;i++){
a[i].r=i+1;
a[i].l=i-1;
a[i].u=a[i].d=i;
}
a[0].l=m;
a[m].r=0;
memset(h,-1,sizeof(h));
int indx=0;
cnt=m+1;
for(int i=1;i<=nn;i++){
for(int j=1;j<=nn;j++){
indx++;
add(indx,i);
add(indx,j+nn);
add(indx,i-j+3*nn);
add(indx,i+j+4*nn-2);
}
}
}
void dance(int step){
if(a[0].r>nn){
tot++;
int x,y;
for(int i=0;i< step;i++){
x=ansk[i]%nn;
y=(ansk[i]-1)/nn+1;
if(!x) x=nn;
ss[tot].ans[x]=y;
}
for(int i=1;i<=nn;i++){
cout << ss[1].ans[i] << " ";
}
exit(0);
return;
}
int cc=a[0].r;
for(int i=a[0].r;i!=nn;i=a[i].r){
if(sum[i]<sum[cc]) cc=i;
}
del(cc);
for(int i=a[cc].d;i!=cc;i=a[i].d){
ansk[step]=a[i].x;
for(int j=a[i].r;j!=i;j=a[j].r) del(a[j].y);
dance(step+1);
ansk[step]=0;
for(int j=a[i].l;j!=i;j=a[j].l) rev(a[j].y);
}
rev(cc);
return;
}
int main(){
scanf("%d",&nn);
init(nn+nn+2*nn+2*nn-2);
dance(0);
cout << "No!";
return 0;
}
为什么这个代码跑 n=150 时,只需要 6ms 但当开到 n=160 时便 TLE 了呢?