QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: _zuoqingyuan

Posted at: 2026-04-04 09:55:20

Last updated: 2026-04-04 11:39:44

Back to Problem

New Editorial for Problem #1856

orz flyfree 太强了,提供一个历史和线段树的做法。首先离散化,则得到了数轴上的若干线段

将 $[l_i,r_i]$ 称为区间,$[A,B]$ 称为询问。扫描区间的下标。

设当前扫到了 $R$,则当前数组 $v_i$ 表示 $[i,R]$ 的美丽度。则当 $R=B$ 时查询 $[A,B]$ 就是询问所有 $i\in [A,B],v_i$ 的历史和。

考虑如何维护扫描过程中 $[L,R]$ 的美丽度,设 $1\sim R$ 的所有区间中最后一个覆盖线段 $i$ 个编号是 $p_i$,则当前线段 $i$ 会对 $v_{1\sim p_i}$ 做贡献。

每次扫描线的右端点移动,新加入一个区间,会改变一些 $p_i$,设原来 $p_i=x$,后来 $p_i=y$,则这次移动会对 $v_{x+1\sim y}$ 新产生贡献。

每次都是覆盖一段区间,可以用珂朵莉树维护,改变一个颜色段的 $p_i$ 可以用一次区间加完成,而这样的区间加只有 $O(n)$ 次。

然后选择心怡的维护历史和的方法即可,例如维护当前完成的操作数 $T$,当前数组 $A$,设历史和数组为 $B$,再维护一个 $C_i=B_i-A_iT$,则只维护 $A,C$ 即可维护 $B$。

时间复杂度为 $O(n\log n)$。https://qoj.ac/submission/2191575

Comments

No comments yet.