[JOISC 2021 Day4] 最悪の記者 4 题解
独立想出来的题!(虽然想漏了一些细节)
线段树合并优化 DP
Statement
[JOISC 2021 Day4] 最悪の記者 4 (Worst Reporter 4)
Solution
容易想到连边 \(i\to a_i\) ,那么形成了一个基环内向树森林
考虑处理每一个基环树,容易发现环上的点最后的值必然相同,所以可以看作是一个点
所以现在就是一颗颗树,容易想到设 \(f[u][i]\) 表示点 \(u\) 取值 \(i\) ,且让子树内都满足要求的最小代价,暴力转移有
\[f[u][i]=[i\neq h_u]c_u+\sum \min_{i\le j\le m}f[v][j] \]\(m\) 表示 \(h[i]\) 离散化后最大值,因为注意到有意义的取值只有 \(O(n)\) 种。
按照这个式子,可以写出暴力 \(O(n^2)\) 的做法。具体就是倒序枚举 \(i\) 进行转移,复杂度的话,每一个 \(f[v][j]\) 只会用于一次 \(f[u]\) 的贡献,所以看似是 \(O(n^3)\) ,实际上是 \(O(n^2)\)
看到那个 \(\min\) 很不爽,于是我们干脆直接设 \(mn[i][j]=\min_{j\le k\le m}f[i][j]\) ,那么
\[mn[u][i]=\min([i\neq h_u]c_u+\sum mn[v][i],mn[u][i+1]) \]发现前面这个 \([i\neq h_u]c_u\) 的贡献实际上是在区间除了一个单点,其他整体增加,容易转成 \(-[i=h_u]c_u\) 这样的贡献方式
可以想到 \(mn[u]\) 是一个单调递增的,而且由数段相同的值组成,可以把 \(mn[u]\) 看成数个颜色段 \((l,r,v)\) 表示 \(mn[l\dots r]=v\) ,那么,每次转移的时候就是儿子的颜色段合并的过程。
容易发现如果没有那个 \(-[i=h_u]c_u\) 的贡献的话,是不用和 \(mn[u][i+1]\) 取 \(\min\) 的,因为我每个儿子都是单调的,相加起来当然是单调的
所以这个合并的过程可以想到使用线段树合并来做,复杂度的保证可以理解为颜色段均摊的复杂度的证法(我毛估估的)
考虑那个 \(-[i=h_u]c_u\) 的贡献,发现相当于把一些颜色段合并成一个大颜色段的过程,每次最多增加一个颜色段,可以直接在线段树上乱搞一个区间取 min 来做
这样好像就做完了,哈哈,复杂度 \(O(n\log n)\)
看了一眼题解,发现题解做法是直接对 \(f\) 线段树合并,很有道理。
Code
咕咕咕,月考完了再写