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");
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值