好久没有写博文了,这题是刚才被 lrj 的题虐了之后写的,这题的题意是告诉你 N 个数的序列,每次修改一个位置的值,动态查询区间第 k 个元素
做法是维护一个线段树,这样我们就可以得到区间的信息,但是这时候我们并不能维护区间有序的序列,所以我们要二分答案,查询 l 到 r 区间内比这个数小的有多少,和 k 做比较,然后最后得到答案,写起来就是一个线段树和一个平衡树,对于平时写数据结构写多的来说代码量一般,我的代码一向都很长,写了 200 行左右。
对于查询操作,假设我要求 u 和 v 路径上全部结点的权值之和,我们可以求出 u 和 v 的 LCA,我们记录为 t,那么我们可以求出根到 u、v 和 t 的权值之和,答案就是 ∑u+∑v−2×∑t+wt,注意不要忘了加上那个 t 的权值。
此外,Tree Problem 也是一个很经典的问题,对于 Tree Problem,我们可以只记录入点,不记录出点,但是要记录每一个点的管辖范围,注意一个点的子树在 DFS 序列中一定是连续的,那么我们就可以记录下这个点的管辖范围,然后利用树状数组维护这个序列,区间查询就可以了,至于需要查找大于其标号的点的个数, 做法大家应该是都知道了的,还不是很清楚的同学可以自己再想想。