Set Operation 【POJ - 2443】【bitset初探】

题目链接


  给你N个集合,第i个集合S[i]有C[i]个元素(注意此处集合并非C++的set,而是允许存在两个相同元素)。每个元素为1到10000之间的整数。接着给你几个问题。对于每个问题给出的元素i,j,你要判断它们是否同时属于一个集合。换句话说,是否存在k(1<=k<=N)可以使i和j均存在与S[k]中。

  因为这里的N不是很大,所以,我们可以枚举每个值所在的位置,也就是储存1000个01,然后呢,我们只要在查询的时候判断两个值是否相&存在1即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1e3 + 7;
int N, C[maxN], S[maxN], Q;
bitset<1000> b[10005], c;
int main()
{
    scanf("%d", &N);
    for(int i=0; i<N; i++)
    {
        scanf("%d", &C[i]);
        for(int j=1, val; j<=C[i]; j++)
        {
            scanf("%d", &val);
            b[val].set(i);
        }
    }
    scanf("%d", &Q);
    int x, y;
    while(Q--)
    {
        scanf("%d%d", &x, &y);
        c = b[x] & b[y];
        printf(c.any() ? "Yes\n" : "No\n");
    }
    return 0;
}
发布了722 篇原创文章 · 获赞 891 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_41730082/article/details/103850567