比赛 动规 评测结果 AAAAAAAAAA
题目名称 安排公牛 最终得分 100
用户昵称 swttc 运行时间 0.122 s
代码语言 C++ 内存使用 12.31 MiB
提交时间 2017-06-18 21:37:59
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#define uint unsigned int

using namespace std;

uint m,n,f[2][1<<20],s[21],cnt[1<<20];//用滚动数组 

int main()
{
	freopen("examnine.in","r",stdin);
	freopen("examnine.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(uint i=1;i<=n;i++)
	{
		uint a;
		scanf("%d",&a);
		for(uint j=1;j<=a;j++)
		{
			uint b;
			scanf("%d",&b);
			s[i]|=(1<<(m-b));
		}
	}
	f[0][0]=1;
	for(uint i=1;i<=n;i++)
	{
		for(uint j=0;j<=(1<<m)-1;j++)
	 	{
	 		if(f[1-i&1][j])
	 		{
	 			for(uint k=s[i];k;k-=(k&-k))
	 			{
	 				uint t=(k&-k);
	 				if(!(j&t))
	 				{
	 					f[i&1][j+t]+=f[1-i&1][j];
	 					//cout<<f[i&1][j+t];cout<<j+t<<endl;;
					}
				}
			}		
	 	}
	 	memset(f[1-i&1],0,sizeof(f[1-i&1]));
	}
	uint ans=0;
	for(uint i=0;i<=(1<<m)-1;i++)
	{
		ans+=f[n&1][i];//cout<<i;
	}
	printf("%d",ans);
	return 0;
}