CSP-S 2024 第十次
AK 了就结束,USACO 赛制是吧(
神秘难度排序,D<C<A<B
A
手模一下可以发现线性基里的数最多也只有两位,考虑模拟一个数插进线性基的过程。
对于 \(2^x\),其会依次异或上 \(2^x+2^{x'},2^{x'}+2^{x''}\)……直到线性基里找不到最高位为 \(x\) 的数,或者某时刻异或上了一个 \(2^x\)。
对于 \(2^x+2^y\),无需考虑消去两位的顺序,\(x,y\) 都会经历上述的变化。
这个变化的过程实际上就是在遍历一条链,于是直接用并查集把这条链维护出来,
具体地,对于线性基中的数 \(2^x+2^{x'}\),从 \(x\) 向 \(x'\) 连边,对于线性基中的数 \(2^x\),从 \(x\) 向 \(0\) 连边,
插入一个数时只需要找其所在链的结尾,在并查集上找祖先即可。
B
考虑钦定一个非叶子为根,从下往上贪心。设 \(s_u\) 表示只在 \(u\) 子树内操作,还有可能清除 \(u\) 子树的情况下,\(u\) 子树的叶子上至少还有多少石头,
(x : y 表示 \(x\) 点上有 \(y\) 块石头)
比如考虑这棵树上的 \(2\) 子树,当然可以清扫 \((4,5)\) 两次使得叶子上没有石头,但这样 \(2\) 子树就不可能清除了,
正确做法是清扫 \((4,5),(3,4),(3,5)\),所以 \(s_2=2\)。
设 \(k=\sum\limits_{v\in\text{son}(u)}s_v\),则此时在 \(u\) 子树内进行的操作会使 \(k\) 减去 \(2\),\(a_u\) 减去 \(1\),
之后在 \(u\) 子树外进行的操作如果对 \(u\) 子树有影响,那么其会使 \(k\) 和 \(a_u\) 都减去 \(1\),
所以任意时刻,还有可能清除 \(u\) 子树当且仅当 \(k\ge a_u\)。
考虑此时在 \(u\) 子树上能做几次操作。首先每次操作会使 \(a_u\) 减去 \(1\),不能做超过 \(a_u\) 次操作,
另外假设做了 \(x\) 次操作,那么需要保证 \(k-2x\ge a_u-x\),则不能做超过 \(k-a_u\) 次操作,
可以发现上面两个条件已经保证操作次数不超过 \(k/2\) 了,
但是考虑一种极端情况,有一个 \(s_v\) 超过了 \(k/2\),那把除其以外的所有子树和其匹配完之后就匹配不了了,
也就是说这种情况下,不能做超过 \(k-s_v\) 次操作。
而肯定是进行越多次操作越好,设最多能做 \(o\) 次操作,则 \(s_u=k-2o\)。
C
考虑一个子集和 \(s\) 可以使 \(k\in[s/2,s]\) 合法(懒得考虑向上取整了,\(s\) 可以使 \(2k\in[s,2s]\) 合法),
注意到以此法产生的 \(2k\) 取值区间并起来之后只有 \(O(\log V)\) 个,所以每次加进一个 \(a_i\),维护当前区间并即可。
具体地,若加入 \(a_i\) 前存在取值区间 \([x,y]\),则加入 \(a_i\) 后还存在取值区间 \([x+a_i,y+2a_i]\),扫描线一遍把它们并起来即可。
D
区间排序问题考虑莫队,发现只有加入的话可以用并查集维护当前围成的圈(也就是当前形成的连通块),
回滚莫队套可撤销并查集即可。