简简单单2篇题解。
B
题意
n次询问,每次给定l,r,求[l,r]内至少删掉多少数,使得剩下的数按位与不为0。 出题人加强版:\(n \leq 2*10^5\),\(l,r \leq 10^9\)
解法
原题数据范围是\(l,r\leq 2*10^5\).先考虑这个怎么做: 按位与不为0,就是存在某一位,满足这个集合所有的数这一位都是1.考虑枚举某一位,前缀和统计个数,即可在对数时间内完成。 加强版不能这么求前缀和了,这迫使我们寻找简便的求某一位为1的个数的算法。考虑二进制加1的过程,我们用以下解法替代前缀和:
1 | long long getcount(long long n, int k) |
代码
1 |
|
C
题意
你有两个长度为n的01串A和B.每次操作可以选择一个当前为1的点,将除了它以外的所有点的数值取反。求至少多少次操作之后,可以把A变成B.\(n\le 10^5\)
解法
单次变换好像看不出来什么,但是简单模拟可以发现,两次变换相当于交换了一对0和1.所以对于总操作次数为偶数的方案,答案可以直接算出来。奇数次操作相当于先进行了一次操作,再进行偶数次操作。枚举第一次操作的两种情况:(选定的1在B中对应的是1还是0),算出来变换之后01和10各有多少种,就可以O(1)得到答案。
代码
1 |
|
D
题意
给定一棵树,有些边的边权已知,有些边未知。现在有一些限制条件,每个条件形如“从u点到v点,边权的异或和的popcount是奇数还是偶数”。要求给出一种可行的给未知边赋值的方案,满足所有条件;或者指出方案不存在。
题解
考虑以下性质: \[\mathrm{popcount}(x\oplus y)\mod 2=\mathrm{popcount}(x) \mod 2 \oplus \mathrm{popcount}(y) \mod 2\] 这个性质指出,对于每一条边,都可以按照popcount的奇偶性变成01边。如果对于每个点维护它到根01路径上的异或和,记为s。那么每个限制就变成了\(s(x) \oplus s(y)=0/1\)。我们用一种类似二分图染色的方法,对于每个连通块,尝试构造可行的方案。染色完成之后,一条边的权值就是\(s(x)\oplus s(\mathrm{fa}[x])\)。
代码
1 |
|