[学习笔记]位运算

计算机为什么用二进制?

因为二进制简单。每个位置只有0/1两种情况。

并且任何数都可以表示成二进制。

0/1代表开/关,选/不选都有优势。

例题:

1.

Single Number

■ 有一个数组,里面的元素每个都出现了两次,除了一个特殊的,求这个特殊元素。

直接异或

Single Number II

■ 还是一个数组,每个元素出现两次,只有两个特殊的元素出现一次,把这两个特
殊的元素找出来。

两个元素不同,至少一位不同。

所有的数异或起来得到a^b,任取为1的一位作为分解线,ab有一个这一位是1,另一个是0.然后把这一位是1的放一组,是0的放一组。

这样a,b一定分开了。然后分别异或可得。

2.BZOJ 4300 绝世好题

■ 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,
■ 满足bi&bi-1!=0(2<=i<=len)。

■ n<=100000,ai<=2*10^9

类似最长上升子序列统计。由于和前一位至少一位都有1,枚举是1的那一位,然后前缀max即可。

BZOJ 3687: 简单题

■ 小呆开始研究集合论了,他提出了关于一个数集四个问题:
1.子集的异或和的算术和。
2.子集的异或和的异或和。
3.子集的算术和的算术和。
4.子集的算术和的异或和。
目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决
定把这个问题交给你,未来的集训队队员来实现。
■ ai >0,1 < n < 1000,∑ai≤2000000。

之间算不好算。发现,异或满足交换律,所以,如果一个算数和出现了2次,那么贡献就是0了。

所以,bitset<2000000>f,计算算数和为f[i]的次数的奇偶性。

对于x,f^=(f<<x)即可。初始f[0]=1;

其实就是bitset优化背包。。。。

猜你喜欢

转载自www.cnblogs.com/Miracevin/p/9817561.html
今日推荐