【bzoj3687】【简单题】bitset
2017-08-15 18:23
357 查看
[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在写暴力的时候说不定能卡过去
相关文章推荐
- BZOJ3687 简单题 解题报告 【递推】【bitset】
- 【bzoj3687】 简单题 bitset
- BZOJ 4000 3687 简单题 dp+bitset
- bzoj 3687 简单题 - bitset
- 【BZOJ3687】简单题 背包+bitset
- BZOJ 3687 简单题 (bitset)
- bzoj 3687 简单题 bitset 解题报告
- [BZOJ3687][简单题][Bitset]
- BZOJ 3687 简单题【dp,bitset基础应用
- BZOJ_3687_简单题_bitset
- 【BZOJ3687】简单题【bitset】
- bzoj 3687 简单题|bitset
- BZOJ 3687: 简单题 bitset 题解
- 【bitset乱搞】BZOJ3687 简单题
- 【bzoj3687】【简单题】bitset
- [bzoj 3687]简单题 bitset的运用
- [bzoj3687]简单题(bitset)
- [bzoj 3687] 简单题:bitset,DP
- [Bzoj3687]简单题(bitset)
- bzoj 3687: 简单题 (dp+bitset)