一些 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\)

Submission

CF817F

最近手感好烂,一直在调题。

给定一个有 \(n\) 个点 \(n-1\) 条线段组成的序列,维护两个操作:

  1. 选定两个点,对两点之间的线段区间加上 \(d\)
  2. 给定一个区间,从区间中等概率取两不相等点,求两点之间所有权值和的期望。

*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)\)

Submission

posted @ 2025-02-07 21:00  Wei_Han  阅读(18)  评论(0)    收藏  举报