Codeforces Round 936 (Div. 2)

A

考虑有 \(x\) 个数与中位数相同,且在中位数之后,则答案为 \(x+1\)(+1 是因为中位数本身)。

B

明显的,每次操作序列的最大子段和。

那么操作完以后,继续操作这个区间即可,相当于每次翻倍。

假设原序列最大子段和为区间 \([l,r]\),则答案为:

\[sum(1,n)-sum(l,r)+sum(l,r) \times 2^k \]

记得特判每个数都小于零的情况,这个时候每次操作空区间,答案即为原序列和。

C

二分。

考虑 check,我们贪心地删边,若当前节点的子树大小大于等于 x,那么我们可以选择删边,并增加连通块数量。但是要注意判断还未处理的那个连通块的大小是否能够大于等于 x。

D

考虑将 \(\oplus_{i=l}^{r}a_i\) 转化为 \(w_r \oplus w_{l-1}\),此处 \(w\)\(a\) 的异或前缀和。

有性质 \(a|(a \oplus b)=a|b\),可得限制 4 等价于选择 \(k\) 个数或起来不超过 \(k\),最后一个数必选。

我们考虑枚举或起来的结果从哪一位开始,与 \(k\) 不同,则此时将这一位置为 \(0\),低于它的设为 \(1\),这便是 \(k\) 在这个条件下的“限制”了(这里措辞挺抽象的,看不懂可以问我)。

那么就好了,在“限制”之内的数全部选上,对于不同的“限制”取 max 即可。

posted @ 2024-04-26 21:30  luogu_gza  阅读(26)  评论(0)    收藏  举报