NOIP模拟赛20251106 T4 CF1270H
题目大意:
定义一个序列 \(a\) 的 \(f(a)\) 表示,将所有 \(i < j, a_{i} < a_{j}\) 连边后的连通块数量。
单点修,每次查询全局的 \(f\) 值。
解题思路:
不知道为啥,我感觉这个题像 CF2147F。
考虑每个连通块一定是一个连续段,因为如果 \(a_{i} < a_{j}\),那么 \(i \sim j\) 一定是一个连通块的。
那么如果一个 \(i\) 是断点,那么要满足前缀最小值大于后缀最小值。
但这个思路只能拿分块维护,时间复杂度 \(O(q \sqrt{n \log n})\)。
下标不好做,考虑换个维度,从值域出发,问题变成 \(\ge val\) 和 \(< val\) 分界点恰好一个,那么单点修的时候就只会更改 \(O(1)\) 条信息。
值域线段树维护就能 \(O(n \log n)\)。
为啥这个套路一直想不到呢?

浙公网安备 33010602011771号