QOJ7899 Say Hello to the future
考虑先不管修改怎么做。考虑 DP,\(f_i\) 表示前缀的答案,然后 cdq 分治优化转移。考虑 \(a_i\) 最大值所在位置,若在右侧那么 \(f_i\) 可以被左侧的一个区间转移到,否则左侧的 \(f_j\) 可以转移到右侧的一个区间,两者都可以线性做。然后考虑问询。我们先求出每个后缀的答案 \(g\)。
我们仍然分治。令 \(t _i\) 为 \(i\) 到 \(mid\) 的区间的最大 \(a\),\(w_i\) 为次大值,\(d_i\) 为取到最大值的位置,那么考虑新的合法区间的左端点 \(l\),考虑其所有跨过 \(mid\) 的新合法区间(需要长度 \(<t_l\)),只有在 \(d_i\) 被修改时才会产生,于是将这个贡献加到 \(ans_{d_i}\) 头上即可。考虑如何计算贡献:对于 \(w_l>t_r\) 的情况,产生贡献的 \(r\) 在右侧的一个区间;而对于 \(w_l<t_r\),则还需要保证 \(t_r<t_l\) 且区间长度 \(<t_l\)。不考虑区间长度 \(<t_l\) 时 \(r\) 对一个区间的 \(l\) 产生贡献,差分即可;区间长度 \(\ge t_l\) 时右侧满足也对 \(l\) 产生贡献的 \(r\) 在一个区间。于是就可以总复杂度 \(O(n\log n)\) 完成。
https://qoj.ac/submission/334848
标签:Say,QOJ7899,future,区间,考虑,Hello From: https://www.cnblogs.com/TetrisCandy/p/18029627