QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: Milmon

Posted at: 2026-02-25 16:26:25

Last updated: 2026-02-25 16:26:31

Back to Problem

题解

先考虑 $a_1, a_2, \cdots, a_m$ 能操作成 $b_1, b_2, \cdots, b_m$ 的等价条件。首先 $a_i \leq b_i$。对于任意 $i$,满足 $a_i \leq x < b_i$ 的数 $x$ 都需要用一次操作将 $x$ 变为 $x + 1$,所以此后至少存在一个数 $x$。由此可以得出充要条件:对于每个被 $[a_i, b_i)$ 包含的 $x$,都存在一个 $b_j = x$。

接下来处理询问。对序列扫描线,用树状数组维护每个左端点,以当前位置为右端点时区间中有多少个不同的 $x$ 不满足上述条件。那么处理询问只需要在树状数组上查询单点是否为 $0$ 即可。对于每个 $x$,记上一次扫到 $b_i = x$ 的下标为 $L_x$,记上一次扫到 $x \in [a_i, b_i)$ 的下标为 $R_x$,那么对树状数组上区间 $(L_x, R_x]$ 有 $1$ 的贡献。

对于 $L_x$ 的更新可以暴力处理。对于 $R_x$ 的更新考虑维护一棵 ODT,接下来需要处理对 $[l, r]$ 中的 $x$ 全部将 $R_x$ 从 $p'$ 修改为 $p$ 的操作,可以先考虑将 $(p', p]$ 这段区间加上 $r - l + 1$ 的贡献,再减去操作前 $L_x > R_x$ 时多算的贡献。由于单点修改 $L_x$ 的次数只有 $N$ 次,所以这部分多算的次数不超过 $N$,直接暴力维护即可。

总时间复杂度为 $\mathcal{O}((N + Q) \log N)$。

Comments

No comments yet.