• 【bzoj3687】【简单题】bitset


    这里写图片描述
    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=64333782
    这次的图是自己画的,方便的话点个赞咯(^-^)

    Description
    小呆开始研究集合论了,他提出了关于一个数集四个问题:
    1.子集的异或和的算术和。
    2.子集的异或和的异或和。
    3.子集的算术和的算术和。
    4.子集的算术和的异或和。
    目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决定把
    这个问题交给你,未来的集训队队员来实现。
    Input
    第一行,一个整数n。
    第二行,n个正整数,表示01,a2….,。
    Output
    一行,包含一个整数,表示所有子集和的异或和。
    Sample Input
    2
    1 3
    Sample Output
    6
    HINT
    【样例解释】
    6=1 异或 3 异或 (1+3)
    【数据规模与约定】
    ai >0,1< n<1000,∑ai≤2000000

    我们希望有一个数组a[],记录每一个数的出现个数,奇数个会对答案做出贡献,偶数个则没有贡献,所以只需要1表示奇数,0表示偶数

    每次新加入一个数x时,我们要对每一个a[]里有的数加x,就相当于全部右移x位(左小右大),意为新增的数们,与原a[]亦或,就可以更新每个数的奇偶了

    暴力做又麻烦又要挂,考虑用bitset优化常数

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<bitset>
    using namespace std;
    
    const int N=1000+5;
    const int A=2000000+5;
    
    bitset<A> a;
    int n,x;
    
    int main(){
        scanf("%d",&n);
        a[0]=1;
        for(int j=1;j<=n;j++){
            scanf("%d",&x);
            a=a^(a<<x);
        }
        int ans=0;
        for(int i=1;i<=A;i++){
            if(a[i]) ans^=i;
        }
        printf("%d",ans);
        return 0;
    }

    总结:
    1、学会灵活运用位运算,将普通bool数组用二进制数来表示,就可以进行很多灵活的操作
    2、bitset在写暴力的时候说不定能卡过去

  • 相关阅读:
    在手机浏览器中判断App是否已安装
    用git无法连接github的解决方法
    使用pdf.js显示pdf文件
    Javascript绝句欣赏
    HTTP Keep-Alive模式
    和浏览器并发请求数有关的一些前端技术
    Javascript标准参考教程学习记录
    [nodejs]国内npm安装nodejs modules失败的几个解决方案
    利用sfntly的sfnttool.jar提取中文字体
    Bzoj4378--Poi2015Logistyka
  • 原文地址:https://www.cnblogs.com/LinnBlanc/p/7763144.html
Copyright © 2020-2023  润新知