关于recover节点时的细节疑惑,蹲一个焗佬帮忙分析一下
查看原帖
关于recover节点时的细节疑惑,蹲一个焗佬帮忙分析一下
222341
twocats楼主2024/10/8 15:55
#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 请问各位大佬是为什么?

2024/10/8 15:55
加载中...