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)\)

为啥这个套路一直想不到呢?

posted @ 2025-11-06 22:25  positive_deviation  阅读(3)  评论(0)    收藏  举报