POJ - 2443 Set Operation 【思维 + bitset操作】 !!!bitset操作详解!!!

bitset详细讲解

首先bitset<10>bit(6); 就可以直接把6转化成了相应的二进制了. 但是如果要输出. 必须先强制转化成int才能输出. 下标从0开始. 然后就是bitset之间的操作只能用bitset来判断, 比如说判断是否等于0. 那么应该先定义bitset<10>bit(0); 然后判 (注意优先级)(bitset[5] & bitset[28] )== bit ? 不能直接写 == 0 . !!!
bitset<10>bit(6): (直接用cout << bit << endl输出为): 0000000110
(或者bitset<10>bit = n || bitset<10>bit(n)).

bitset中一些比较有用的操作:
bit.any() //bit中是否存在为1的二进制位? (存在就是1)
bit.count() //bit中二进制位为1的个数
bit.set() //把bit中所有的二进位置为1
bit.reset() //把bit中所有的二进位置为0

例题: POJ - 2443
//题意: 给你很多集合. 问两个数是否存在在同一个集合.
//思路: 每一个数用一个bitset来存. 在的集合序号对应的二进制出令成1. 那么判断是否存在再相同集合, 直接对应的bitset 与 一下就行, 如果等于0就不在, 否则就在.

AC Code

const int maxn = 1e4+5;
void solve()
{
    int n;
    scanf("%d",&n);
    bitset<1005> bit[maxn];
    for(int i=1;i<=n;i++){
        int k; scanf("%d",&k);
        while(k--){
            int u; scanf("%d",&u);
            bit[u][i] = 1;
        }
    }
    int q;
    scanf("%d",&q);
    while(q--){
        int u,v;
        scanf("%d%d",&u,&v);
        bitset<1005> tmp(0);
        if((bit[u] & bit[v]) == tmp){
            printf("No\n");
        }
        else
            printf("Yes\n");
    }
}

你可能感兴趣的:(二进制思维/状压/bitset,STL库的应用)