记录编号 383755 评测结果 AAAAAAA
题目名称 漫游小镇 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2017-03-16 13:13:15 内存使用 16.90 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e4+10;
int n,m,q[N],size,d[N][11],tag[1<<22];
ll dp[2][N];
void set(int &x,int p,int tp){
	x&=~(3<<(p<<1));
	x|=(tp<<(p<<1));
}
int Set(int x,int p,int tp){
	set(x,p,tp);
	return x;
}
int Get(int x,int p){return (x>>(p<<1))&3;}
/*void print(int x,int radix=4){
	char s[30]="";
	itoa(x,s,radix);
	printf("%s",s);
}*/
int stack[11],top;
void dfs(int p,int S,int cnt){
	if (cnt<0) return;
	if (p>n){
		if (cnt) return;
		top=0;
		for (int i=0;i<=n;i++){
			int tp=Get(S,i);
			if (tp==1) stack[++top]=i;
			if (tp==2){
				d[size][i]=stack[top];
				d[size][stack[top--]]=i;
			}
		}
		tag[S]=size;
		q[size++]=S;
		return;
	}
	dfs(p+1,Set(S,p,0),cnt);
	dfs(p+1,Set(S,p,1),cnt+1);
	dfs(p+1,Set(S,p,2),cnt-1);
	dfs(p+1,Set(S,p,3),cnt);
}
int main()
{
	freopen("betsy.in","r",stdin);
	freopen("betsy.out","w",stdout);
	scanf("%d",&n);
	dfs(0,0,0);
	ll *x=dp[0],*y=dp[1],ans=0;
	x[tag[Set(Set(0,n,2),0,1)]]=1;
	for (int i=0;i<n;i++){
		for (int j=0;j<n;j++){
			for (int k=0;k<size;k++) y[k]=0;
			for (int k=0;k<size;k++)
			if (x[k]){//现在在(i,j),插头状态为k 
				int S=q[k];
				int right=Get(S,j),down=Get(S,j+1);
				if (right==1&&down==2){
					if (i==n-1&&j==n-1&&!Set(Set(S,j,0),j+1,0)) ans=x[k];
					continue;
				}
				if (right==3&&down==3) continue;
				if (!right&&!down){
					y[tag[Set(Set(S,j,1),j+1,2)]]+=x[k];
					//y[tag[S]]+=x[k];
				}
				else
				if ((!right)^(!down)){
					int p=right|down;
					y[tag[Set(Set(S,j,p),j+1,0)]]+=x[k];
					y[tag[Set(Set(S,j,0),j+1,p)]]+=x[k];
				}
				else
				if (right==3||down==3){
					int T=S;
					set(T,down==3?d[k][j]:d[k][j+1],3);
					set(T,j,0);set(T,j+1,0);
					y[tag[T]]+=x[k];
				}
				else{
					int T=S,l=d[k][j],r=d[k][j+1];
					if (l>r) swap(l,r);
					set(T,l,1),set(T,r,2);
					set(T,j,0),set(T,j+1,0);
					y[tag[T]]+=x[k];
				}
			}
			swap(x,y);
		}
		for (int k=0;k<size;k++) y[k]=0;
		//printf("line:%d\n",i);
		for (int k=0;k<size;k++){
			int S=q[k],tp=Get(S,n);
			if (!tp&&(S<<2)&&x[k])
				y[tag[S<<2]]=x[k];//,print(S),printf(" %lld\n",x[k]);
		}
		//puts("");
		swap(x,y);
	}
	printf("%lld\n",ans);
	return 0;
}