舞蹈链 模板

精确覆盖

#include
using namespace std;
const int N = 260000;
inline int in(){
	int x=0;char c=0;
	while(c<'0'||c>'9') c=getchar();
	while(c<='9'&&c>='0') x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x;  
}
int n,m,cnt;
int l[N],r[N],u[N],d[N],col[N],row[N],h[N],s[N];
int ansk[N];
void init(int m){//m个元素 
	for(int i = 0; i <= m; i++){
		r[i]=i+1,l[i]=i-1;
		u[i]=d[i]=i;
	}
	r[m]=0;l[0]=m;
	memset(h,-1,sizeof(h));
	memset(s,0,sizeof(s));
	cnt=m+1;
}
void link(int R,int C){
	s[C]++;
	row[cnt]=R;col[cnt]=C;
	u[cnt]=C;d[cnt]=d[C];
	u[d[C]]=cnt;d[C]=cnt;
	if(h[R]==-1) h[R]=l[cnt]=r[cnt]=cnt;
	else{
		r[cnt]=h[R];l[cnt]=l[h[R]];
		r[l[h[R]]]=cnt;l[h[R]]=cnt;
	} 
	cnt++;
	return;
}
inline void remove(int C){
	r[l[C]]=r[C],l[r[C]]=l[C];
	for(int i=d[C]; i!=C; i=d[i]){
		for(int j=r[i]; j!=i; j=r[j]){
			u[d[j]]=u[j];
			d[u[j]]=d[j];
			s[col[j]]--;
		}
	}
}
inline void resume(int C){
	for(int i=u[C]; i!=C; i=u[i]){
		for(int j=l[i]; j!=i; j=l[j]){
			u[d[j]]=j;d[u[j]]=j;
			s[col[j]]++;
		}
	}
	r[l[C]]=C;
	l[r[C]]=C;
}
bool dance(int deep){
	if(r[0]==0){
		register int i=0;
		for(i=0;i

 

你可能感兴趣的:(板子,Dance,links)