一些 CF 题
再开一坑!以后慢慢填吧。
感觉以后写题要加上题意简述了,不然往前看真的记不起题面。
CF2062D
给定一棵树,每个点有取值范围 \([l_i,r_i]\),每个点可以在范围内随意取值,进行任意次操作,每次操作选定 \(u,v\),表示以 \(u\) 为根,\(v\) 所在的子树内的节点全部 \(+1\),求通过操作使全树变成的最小统一权值。
\(n\leq 2\times 10^5\),\(0 \leq l_i \leq r_i \leq 10^9\)
*2200,div1+2的 D 题,第一眼看上去很不可做,又是换根子树加,又是全局统一的。
来分析一下性质,换根子树加一显然可以做转化,钦定 \(1\) 为根,当选定的 \(u\) 不在 \(v\) 的子树内时,操作等价于子树 \(+1\),当 \(u\) 在 \(v\) 的子树内,相当于全局 \(+1\),\(u\) 所在子树 \(-1\),这样操作就转化成了子树的任意权值变化,我们令 \(f_i\) 表示以 \(i\) 为根的子树内变成的最小统一权值,这个东西都不用 dp,直接贪心即可,记 \(mx = \max_{v \in son_u} f_v\),则当 \(mx \leq r_u\) 时,我们需要进行子树加法操作,但因为对答案没有影响,所以不用记录,直接令 \(f_u \gets \max (l_u,mx)\),当 \(mx > r_u\) 时,我们需要子树减操作,而他夹带着全局加法,所以我们需要记录这个操作的个数,又因为要令操作次数最小,统计 \(\sum_{v\in son_u} \max(0,f_v - r_u)\),最后令 \(f_u \gets mx\) 即可,我们用 \(ans\) 记录全局加法的个数,则最后的答案为 \(f_1 + ans\)。
CF817F
最近手感好烂,一直在调题。
给定一个有 \(n\) 个点 \(n-1\) 条线段组成的序列,维护两个操作:
- 选定两个点,对两点之间的线段区间加上 \(d\)。
- 给定一个区间,从区间中等概率取两不相等点,求两点之间所有权值和的期望。
*2300,一开始想了个区间加维护前缀和的唐氏做法,真是无敌,没想到式子这么简单。
考虑一个元素被选中的次数,总方案有 \(\frac{n(n-1)}{2}\),此处 \(n\) 为查询区间长度,下文同理。我们只把点转成线段,只看线段覆盖次数,也就是 \((i-l+1)(r-i+1)\),\(l,r\) 为缩减之后的。那么这一个点的期望贡献为 \(\frac{a_i(i-l+1)(r-i+1)}{\frac{n(n-1)}{2}}\),硬拆式子,整理得到,原式等价于求 \(-(\sum a_i i^2) + (r-l+1-lr)(\sum a_i) + (l+r)(\sum a_i i)\)。
结论明显,用线段树分别维护 \(\sum a_i\),\(\sum a_i i\),\(\sum a_i i^2\) 即可,第一个是普通区间加法,第二个第三个事先在线段树中维护出 \(\sum i\) 和 \(\sum i^2\) 即可,加法时直接乘就好了,复杂度 \(O(n\log n)\)。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号