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

区间排序问题考虑莫队,发现只有加入的话可以用并查集维护当前围成的圈(也就是当前形成的连通块),

回滚莫队套可撤销并查集即可。

posted @ 2024-10-08 11:30  5k_sync_closer  阅读(118)  评论(7编辑  收藏  举报