#include<bits/stdc++.h>
//#define int long long
#define F(i,j,k) for(register int i=j,end=k;i<=end;i++)
#define D(i,j,k) for(register int i=j,end=k;i>=end;i--)
#define FV(i,v) for(register int i=0,end=v.size();i<end;i++)
#define FG(i,u) for(register int i=h[u];i;i=e[i].next)
#define FZ(i,n) for(register int i=0,end=1<<n;i<end;i++)
#define IT(i,A,x) for(register int i=A[x];i!=x;i=A[i])
#define To e[i].to
#define mid ((l+r)>>1)
#define ls (u<<1)
#define rs (u<<1|1)
#define lson ls,l,mid
#define rson rs,mid+1,r
#define inf 0x7FFFFFFF
#define N 100005
using namespace std;
int n,m,x,idx,ans,L[N],R[N],U[N],D[N],H[N],siz[N],col[N],row[N],stk[N];
inline void ri(int &x)
{
x=0;
char c=getchar();
while(c<48||c>57) c=getchar();
while(c>47&&c<58) x=x*10+c-48,c=getchar();
}
void remove(int c)
{
L[R[c]]=L[c],R[L[c]]=R[c];
IT(i,D,c) IT(j,R,i) U[D[j]]=U[j],D[U[j]]=D[j],siz[col[j]]--;
}
void recover(int c)
{
L[R[c]]=R[L[c]]=c;
IT(i,U,c) IT(j,L,i) U[D[j]]=D[U[j]]=j,siz[col[j]]++;//1*1
}
void build(int c)
{
F(i,0,c) L[i]=i-1,R[i]=i+1,U[i]=D[i]=i;
L[0]=c,R[c]=0,idx=c;
memset(H,0,sizeof(H));
memset(siz,0,sizeof(siz));
}
void insert(int r,int c)
{
row[++idx]=r,col[idx]=c,siz[c]++;
U[idx]=c,D[idx]=D[c],U[D[c]]=idx,D[c]=idx;
if(!H[r]) H[r]=L[idx]=R[idx]=idx;
else L[idx]=H[r],R[idx]=R[H[r]],L[R[H[r]]]=idx,R[H[r]]=idx;
}
bool dance(int dep)
{
int c=R[0];
if(!c)
{
ans=dep;
return 1;
}
IT(i,R,0) if(siz[i]<siz[c]) c=i;
remove(c);
IT(i,D,c)
{
stk[dep]=row[i];
IT(j,R,i) remove(col[j]);
if(dance(dep+1)) return 1;
IT(j,L,i) recover(col[j]);//2*2
}
recover(c);
return 0;
}
/*
change 1*1 & 2*2 -> slower
only change 1*1 -> no diff
only change 2*2 -> wa & tle
i dont know why.
*/
int main()
{
ri(n),ri(m);
build(m);
F(i,1,n)
F(j,1,m)
{
ri(x);
if(x) insert(i,j);
}
dance(0);
if(ans) F(i,0,ans-1) printf("%d ",stk[i]);
else puts("No Solution!");
return 0;
}
我只改1×1为IT(i,D,c) IT(j,R,i)时 无变化48ms 我只改2×2为IT(j,R,i)时 只有40pts,有tle有wa 我把1×1和2×2都改了的时候,速度变慢了126ms 请问各位大佬是为什么?