Codeforces Round 1037 (Div. 3) 部分题解

E 不会闹麻了

F. 1-1-1, Free Tree!

题目链接

定根后,设 \(f_{x,w}\)\(x\) 的所有儿子连边中,颜色为 \(w\) 的儿子的连边边权和(颜色和 \(x\) 相同的也算进去),动态维护最终答案。

对于一个修改,只需要修改 \(x\) 子树的答案和 \(fa_x\) 子树的一些答案,状态只需要修改 \(f_{fa_x}\) 的内容,修改次数是常数。

可以发现总状态量是 \(O(n+Q)\) 的,用一个 map 维护 \(f\) 就可以。

code

G - Big Wins!

题目

弱化版的 \(a_i\leq 100\),提示我们枚举中位数的值。

一个重要结论是当中位数为 \(w\) 时,令 \(b_i=1\)\(b_i\geq w\) 时,否则为 \(-1\) 。一个区间的中位数大于等于 \(w\) 当且仅当区间 \(b\) 的和非负。

那对于一个枚举的定值中位数 \(w\) ,求出 \(b_i\) 后做前缀和,对于一个右端点 \(r\) ,左端点越小越好,可以用数据结构维护出满足区间和非负的最小左端点,再求个区间最小就能更新。

考虑一般情况,中位数变大时最小值越难取到,可以双指针。用数据结构维护 \(b\) 前后缀和。

对于一个最小值位置 \(x\) ,判断其可行的条件是存在一个包含 \(x\) 的区间的 \(b\) 的和是非负的,也就是判断包含 \(x\) 的和最大的区间,也就是分别以 \(x\) 为左端点和右端点的最大和区间加起来。最后的可以用数据结构维护出来。

造了个大大的线段树,哥哥的并查集做法还是太强了。

code

posted @ 2025-07-19 10:00  蒻蒻虫  阅读(56)  评论(0)    收藏  举报