zoukankan      html  css  js  c++  java
  • 【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在写暴力的时候说不定能卡过去

  • 相关阅读:
    idea 文件名乱码问题的解决
    <context:component-scan>使用说明
    <mvc:annotation-driven />
    mac下的一些常识
    centos下的防火墙配置
    mac 下安装nginx
    centos下安装nginx
    Centos-统计文件或目录占用磁盘空间-du
    Centos-查看磁盘分区占用情况-df
    Centos-重定向方式打包、备份、还原、恢复工具-cpio
  • 原文地址:https://www.cnblogs.com/LinnBlanc/p/7763144.html
Copyright © 2011-2022 走看看