题解:P12554 [UOI 2024] Queries for Subarray Beauty
CommonAnts · · 题解
题解
思路
我们要求区间的优美值,优美值的定义是分段后每段和绝对值的最小值。所以我们得先研究最优划分方案。先在整个数组
考虑对一个最优划分方案进行调整,我们可以发现一些性质:
- 因为是绝对值,段明显可以分为正段和负段。
- 两个相邻正段或者相邻负段合并后更优,所以最优解肯定是正负段交替出现。
- (除了开头和结尾位置)正段内如果有负前缀和/后缀和,那一段前缀/后缀分给相邻的负端更优。同理负段也不能有正前缀和/后缀和。也就是说每个段必定是自己区间的最大/小子段和。
- 进一步考虑,如果一个正段前面/后面若干个整段的和是非负的,合并进这个正段更优。负段同理。对于相邻的三段,中间一段的绝对值如果不是严格大于旁边两段,三段合并更优。但是对于相邻四段
a,b,c,d ,\lvert b\rvert \le \lvert c\rvert 时合并abc 更优,\lvert c\rvert \le \lvert b\rvert 时合并bcd 更优,所以调整后的最优解不可能有四段。 - 综上,调整后最优解要么分一段(区间和),要么分两段(分界点在前缀最大值或者前缀最小值),要么分三段且中间一段绝对值严格最大。只需要考虑这几种情况。
分一段和两段都容易维护,考虑三段的最优方案怎么算。负正负和正负正两种情况对称,我们接下来不妨只讨论正负正的分段。
可能的一个错误思路是直接找最大/最小前缀/后缀和作为分界点,但这不对。例如
-2,9,-8,9,-2 就是一个反例,最优划分是[-2,9][-8][9,-2] 。
因为三段方案中间一段绝对值严格最大(否则不如合成一段),实际上三段方案的权值等于第一段和最后一段的和的较小值。如果我们枚举中间的分界位置
引理. 要么
证:只有一种情况可能出问题,即某个
所以我们现在只要求
算法
建一个线段树
线段树上二分区间内的位置也是经典问题。大致思路是先定位出查询区间对应的所有线段树节点区间,从两边向中间逐个区间考虑,每次在较小的一端合并下一个区间,最后得到二分位置在哪个线段树节点区间内,再在那个区间的线段树子树内递归二分。也有递归的写法。
复杂度: