GT and set

 Accepts: 35
 Submissions: 194
 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
有NN个集合,每个集合中有A_iA​i​​个数。
你要将这NN个集合划成LL个部分,使得每个部分的集合至少有一个共有的数。
如果至少有一个解输出YESYES,否则输出NONO
输入描述
第一行一个数T表示数据组数。(TT\leq≤2020)

对于每一组数据:
第一行两个数NN和LL。
接下来NN行每行描述一个集合:
第一个数A_iA​i​​表示该集合的大小,之后xx个互不相同的整数表示该集合的元素。
集合里的数字都是正整数且不大于300300. 1\leq1≤NN\leq30≤30,1\leq1≤L\leq5L≤5,1\leq1≤A_iA​i​​\leq10≤10,1 \leq L \leq N1≤L≤N hack时建议输出最后一行的行末回车;每一行的结尾不要输出空格。
输出描述
对于每组数据输出一行YESYES或NONO
输入样例
2
2 1
1 1
1 2
3 2
3 1 2 3
3 4 5 6
3 2 5 6
输出样例
NO
YES
Hint
对于第二个样例,有三个集合{1 2 3},{4 5 6},{2 5 6} 你要划成两个部分。
有一种方案是把第二个和第三个集合划成一个部分,第一个在另一个部分。有一种方案是把第二个和第三个集合划成一个部分,第一个在另一个部分。 第二个和第三个集合的数字有一个交集{6},所以合法。
还有一种划分方案就是把第一个和第三个集合划成一个部分,第二个在另一个部分。
///
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#include<bitset>
#include<set>
#include<vector>
using namespace std ;
typedef unsigned long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,127,sizeof(a));
#define memfy(a) memset(a,-1,sizeof(a));
#define TS printf("111111\n");
#define FOR(i,a,b) for( int i=a;i<=b;i++)
#define FORJ(i,a,b) for(int i=a;i>=b;i--) #define inf 100000000
inline ll read()
{
ll x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
//***************************************
#define maxn 33
bool flag,vis[maxn];
int num[maxn],n,A,L;
bitset<> S[maxn],tmp,temp,aa[maxn]; void dfs(int x)
{ if(x==n+)
{
flag=;
for(int i=;i<=L;i++)
{
if(!num[i])flag=;
}
return ;
}
if(flag)return ;
for(int i=;i<=L;i++){
temp=aa[i];
tmp=aa[i]&S[x];
if(tmp.count()!=)
{
aa[i]=tmp;
num[i]++;
dfs(x+);
num[i]--;
aa[i]=temp;
}
} }
int main()
{ int T=read();
while(T--)
{
scanf("%d%d",&n,&L);
mem(vis);mem(num);
FOR(i,,){
S[i].reset();aa[i].set();
}
FOR(i,,n){
scanf("%d",&A);
FOR(j,,A){
int x=read();
S[i].set(x);
}
}
// for(int i=1;i<=6;i++)cout<<S[3][i];
flag=;
dfs();
if(flag){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
return ;
}

代码

最新文章

  1. 在Altium_Designer_PCB_中插入图片的方法
  2. thread_Disruptor
  3. redis pool
  4. PHP学习——数据类型
  5. 土法炼钢:怎么实现一个简单的B+Tree In-Disk
  6. 引用类型之Function类型
  7. AES 加密
  8. Jquery AJAX POST与GET之间的区别
  9. matlab 自定义函数及调用
  10. Problem G
  11. Asp.net的sessionState四种模式配置方案
  12. MySQL中的数值函数
  13. [编译] 4、在Linux下搭建nRF51822的开发烧写环境(makefile版)
  14. Android View转为图片保存为本地文件,异步监听回调操作结果;
  15. 谈谈自己体会到的HTML5
  16. jdbc配置Spring
  17. png 2 icon
  18. Oracle错误及解决方案
  19. 爬虫bs4
  20. Jmeter--调度器配置

热门文章

  1. Extensions can add new functionality to a type, but they cannot override existing functionality.
  2. How a stack frame works 栈帧的要素与构建步骤
  3. 模板—splay
  4. 代码分析工具splint安装介绍
  5. 利用gsoap库封装易用的rest框架
  6. UVA - 247 Calling Circles(Floyd求传递闭包)
  7. [POJ1155]TELE(树形背包dp)
  8. &lt;SpringMvc&gt;入门三 参数绑定
  9. 如何在 CentOS 7 上安装 Nginx
  10. docker-ce安装官翻