山外集训Day5

赛:https://files.cnblogs.com/files/blogs/832279/11.zip?t=1785652870&download=true
题解:https://files.cnblogs.com/files/blogs/832279/8_1_26_solution.zip?t=1785847409&download=true

T1

我们对于相邻的两项 \(a_i,a_{i + 1}\),考虑在二进制下它们第一个不同的位。
如果 \(a_i\) 的这一位为 \(1\),就意味着 \(X\) 的这一位必须为 \(1\),其它位置无所谓。
否则,\(X\) 的这一位必须为 \(0\),其它位置无所谓。
我们如果找到了哪一位是矛盾的,就直接输出 \(0\)
否则初始化答案为 \(1\) 如果某一位可以是 \(1\) 也可以是 \(0\),就把答案乘上 \(2\)

T2

我们直接对于原树像点分治一样建出另一棵树,但是不是每次选的都是子树重心,而是子树中最小的点。
其实原树就没有什么用了。
而对于新树,我们只能选择一条根到某个叶子的链上的某些点。
我们考虑dfs时用set维护选哪些点,如果当前点的魔力值为非正数,则不选;否则如果set的size小于M,则选这个点;否则如果set中的最小值小于当前点的魔力值,直接删了那个最小值,并加入当前点。

T3

我乱搞过了?!!
不过老师说我这种做法应该正确。
考虑对暴力进行优化。
我们从后往前枚举,暴力做法是直接不停地把这个点向后swap,直到不能swap或者swap后字典序会更小。
每次会跳 \(\mathcal O(n)\) 次。
注意到不能swap或者swap后字典序会更小对应 \(a_j > a_i - k\)
我们直接在序列上维护平衡树,并在平衡树上二分第一个满足这个条件的点即可。
然后直接把 \(a_i\) 放在这个点的前面,我们就不用swap那么多次了。
复杂度 \(\mathcal O(n\log n)\)

T4

不会。


题:
luogu:P1712
P3157
P2048
P5283
P2824
P9871
P4052
P2414

posted @ 2026-08-02 14:45  SigmaToT  阅读(7)  评论(0)    收藏  举报