[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

咕咕咕,月考完了再写

posted @ 2022-04-13 11:40  _Famiglistimo  阅读(75)  评论(0编辑  收藏  举报