P11119 [ROI 2024] 保持连接 (Day 2) 题解

· · 题解

:::::info[题目基本信息] 考察:图论,动态规划 DP,双指针(省选/NOI-)。
题目简介:
给定 \{a_n\},你初始时有一个数,第 i 个数代表你位于 [\max(1,i-a_i),\min(n,i+a_i)] 内时你可以选择 i 作为你手中的数。
假设现在你需要从 l 走到 r,初始时你可以在 l 处选择一个数,然后你不断走向下一个位置(设你现在从 x 走到 x+1,手上的数是 p):

f(l,r) 为从 l 走到 r 时重新选择一个数的次数的最小值,那么 \{a_n\} 所带来的贡献为:

\sum_{l=1}^n\sum_{r=l+1}^nf(l,r)

特别地,你现在还有一个数 x,你可以将一个 a_i 更换为 x(可以不更换),问上式的最小值是多少。
数据范围:

现在 x\ne 0 了考虑怎么做。
观察一下通过把 a_i 换成 x 会发生什么变化,那么满足 pos\in[\max(1,i-x),\min(n,i+x)]\land ft_{pos}\le\min(n,i+x) 条件的 pos 的父亲全部会改为 \min(n,i+x)+1,考虑详细刻画这个东西。
随便写一下点 i 的贡献是 (f_{r+1}+n-r-f_i)siz_i 的,但是这样区间内的点加起来就算重了,考虑怎么修改。
注意到若存在边 i\rightarrow j,那么在 i 的时候就不需要再算一遍 j 的贡献了,那么在算 i 的时候就可以把 j 的贡献减去(至于为什么不只算 i 不算 j 是因为这样算 i 时就需要处理 j 的所有儿子,同时儿子不被算后还需要再 i 中加回贡献,这样很麻烦而且时间复杂度实现不好会爆)。
这样我们就基本做完了这道题。最开始使用 multiset 寻找所有 pos 的父亲,最后统计答案的时候双指针拆成 f_{r+1}+n-rf_i 两项后使用 BIT 维护即可 \Theta(n\log n) 的时间复杂度,不过这是 DS 学傻了的后果。

时空复杂度均为 \Theta(n)

code