QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: yangzichen1203

Posted at: 2026-07-22 21:46:13

Last updated: 2026-07-22 22:08:11

Back to Problem

单侧递归线段树学习笔记

题意转换后就是单点修改,区间询问前缀单调栈内位置之和。

用线段树维护,显然该信息无法快速从左右儿子处合并,考虑在处理左儿子对右儿子的影响。

形式化一下需要维护的信息:

$$sum_c=sum_l+f(r,min_l)$$

$f(c,x)$ 表示节点 $c$ 内值均小于 $x$ 的前缀单调栈内位置之和。

考虑快速求出 $f(c,x)$:

若 $min_l\ge x$,则 $f(c,x)=f(r,x)$。

否则,$f(c,x)=f(l,x)+f(r,min_l)$。但是注意到 $sum_c=sum_l+f(r,min_l)$,所以 $f(c,x)=f(l,x)+sum_c-sum_l$。

那么求 $f(c,x)$ 的时间复杂度就是 $O(\log n)$ 的了。

单点修改需要更新 $O(\log n)$ 个节点,时间复杂度 $O(\log^2 n)$。

区间询问就是将区间分解成 $O(\log n)$ 个节点,从左到右求 $f(c,x)$,更新 $x$,时间复杂度 $O(\log^2 n)$。

Comments

No comments yet.