BestCoder Round #60.1003.GT and set/HDU5506 dfs

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},所以合法。
还有一种划分方案就是把第一个和第三个集合划成一个部分,第二个在另一个部分。

///1085422276
#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=0,f=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘)
    {
        if(ch==‘-‘)f=-1;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘)
    {
        x=x*10+ch-‘0‘;
        ch=getchar();
    }
    return x*f;
}
//***************************************
#define maxn 33
bool flag,vis[maxn];
int num[maxn],n,A,L;
bitset<301> S[maxn],tmp,temp,aa[maxn];

void dfs(int x)
{

      if(x==n+1)
      {
          flag=1;
          for(int i=1;i<=L;i++)
          {
              if(!num[i])flag=0;
          }
          return ;
      }
        if(flag)return ;
      for(int i=1;i<=L;i++){
        temp=aa[i];
          tmp=aa[i]&S[x];
          if(tmp.count()!=0)
          {
              aa[i]=tmp;
              num[i]++;
              dfs(x+1);
              num[i]--;
              aa[i]=temp;
          }
      }

}
int main()
{

    int T=read();
    while(T--)
    {
        scanf("%d%d",&n,&L);
        mem(vis);mem(num);
        FOR(i,1,30){
            S[i].reset();aa[i].set();
        }
        FOR(i,1,n){
            scanf("%d",&A);
            FOR(j,1,A){
                int x=read();
                S[i].set(x);
            }
        }
    //    for(int i=1;i<=6;i++)cout<<S[3][i];
        flag=0;
        dfs(1);
        if(flag){
            cout<<"YES"<<endl;
        }
        else{
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

代码

时间: 2024-10-23 20:04:50

BestCoder Round #60.1003.GT and set/HDU5506 dfs的相关文章

从lca到树链剖分 bestcoder round#45 1003

bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或),高手就不这么做了,直接树链剖分.为什么不能用lca,因为如果有树退化成链,那么每次询问的复杂度是O(n), 那么q次询问的时间复杂度是O(qn) 什么是树链剖分呢? 就是把树的边分成轻链和重链 http://blogsina.com.cn/s/blog_6974c8b20100zc61.htmlh

BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]

传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 264    Accepted Submission(s): 57 Problem Description GTY has n gay friends. To manage them conveniently, every morning he o

hdu5504 GT and sequence(BestCoder Round #60 )

GT and sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 334 Accepted Submission(s): 85 Problem Description You are given a sequence of N integers. You should choose some numbers(at least o

HDU 5806 NanoApe Loves Sequence Ⅱ(尺取+思维)——BestCoder Round #86 1003

传送门 NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others)Total Submission(s): 514    Accepted Submission(s): 248 Problem Description NanoApe, the Retired Dog, has returned back to prepare for f

HDU 5778 abs(暴力枚举)——BestCoder Round #85 1003

传送门 abs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1474    Accepted Submission(s): 511 Problem Description Given a number x, ask positive integer y≥2, that satisfy the following condition

HDU 5682/BestCoder Round #83 1003 zxa and leaf 二分+树

zxa and leaf Problem Description zxa have an unrooted tree with n nodes, including (n−1) undirected edges, whose nodes are numbered from 1 to n. The degree of each node is defined as the number of the edges connected to it, and each node whose degree

BestCoder Round#8 1003

dp[i][j] 表示以i结尾的长度为j的递增子序列dp[i][j] = sum(dp[k][j])     k<i && a[i] >a[j]如果只是单纯的循环for(j=2; j<=m; ++j) for(i=1; i<=n; ++i) for(k=1; k<i; ++k) if(a[i] > a[j]) dp[i][j] += dp[k][j-1];时间复杂度是O(n * n * m)   TLE但是k循环可以用树状数组来优化,k循环可以看做是一个

BestCoder Round #60 1002

Problem Description You are given two numbers NNN and MMM. Every step you can get a new NNN in the way that multiply NNN by a factor of NNN. Work out how many steps can NNN be equal to MMM at least. If N can't be to M forever,print −1-1−1. Input In t

BestCoder Round #86 1003

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:有多少个区间里的第 k 大的数不小于 m 解法:尺取法,首先我们用dp[i]保存到i的位置有多少大于m的数 l=1,r=1,r开始遍历,只要符合dp[l]-dp[r]==k就是sum+=(n-r+1) 然后根据情况移动l,r #include<stdio.h> //#include<bits/stdc++.h> #include<string.h> #include