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 即可。
标签:sum,中位数,oplus,Codeforces,序列,Div,936 From: https://www.cnblogs.com/acwing-gza/p/18160922