P11119 [ROI 2024] 保持连接 (Day 2) 题解
:::::info[题目基本信息]
考察:图论,动态规划 DP,双指针(省选/NOI-)。
题目简介:
给定
假设现在你需要从
- 若在
x+1 上可以选择p ,那么直接走过去。 - 否则,在
x+1 处重新选择一个数,然后再走过去。
设
特别地,你现在还有一个数
数据范围:
-
1\le n\le 10^6 -
0\le x\le n -
\forall i\in[1,n],0\le a_i\le n ::::: 先考虑没有这个
x 我们要怎么做。
令l_i=\max(1,i-a_i),r_i=\min(n,i+a_i) ,那么当我们位于pos 时,我们肯定会选择r_i 尽可能大的i 作为手中的数字。这时我们可以连一条pos\rightarrow r_i+1 的边,这样就变成了一个以n+1 为根的内向树,下文中我们称r_i+1 为pos 的父亲(ft_{pos}=r_i+1 )。
自然而然地想要设 DP 状态,设f_i 表示在i 到n+1 的贡献,那么容易得到 DP 转移:f_i=f_{ft_i}+n-ft_i+1 其中最初时
f_{n+1}=0 。
那么在x=0 时答案就是\displaystyle\sum_{i=1}^nf_i 。
现在
观察一下通过把
随便写一下点
注意到若存在边
这样我们就基本做完了这道题。最开始使用 multiset 寻找所有
- 寻找
pos 的父亲:
注意到pos 的父亲下界也是pos+1 ,也就是说r_i<pos 的i 可以不删去,反正也统计不到答案里,这样只需要维护前缀最大值就可以消掉\log 。 - 统计答案:
你都双指针了你干嘛还要上 BIT,你直接开桶维护每个位置的权值然后动态维护上述两项的值就可以消掉\log 。
时空复杂度均为
code