狂补数据结构的知识!!还需慢慢消化🐷主席树的本质就是线段树,叫做可持久化线段树,最为经典的问题就是查询区间第k小的数(说是第k大,HDU2665上面说the kth big number),分静态(不带修改)和动态(带修改)两种。
POJ2104||HDU2665(静态)
题意:主席树入门题,题意是查询区间内第k小,主席树入门模板题,可以参考这篇blog。POJ上面的数据好像有点弱,。
每次加入一个新的节点,就要更新线段树,T[i]代表第i颗线段树的根节点,sum[i]表示节点i对应区间的个数,然后根据线段树的性质,左边的子节点总比右边的子节点的数小,那么左边子节点总数就说明左边子节点的最小的数还要小,然后根据左右子节点的个数可以判断出我要找的第k小数在哪个区间内,递归查找就可以了。
1 |
|
ZOJ-2122.Dynamic Rankings(动态)
题意:动态求区间第k小,可参考blog。
1 |
|
HDU6703
主席树加set
你有两个操作:$(1,pos)$将$a_{pos}$变成$a_{pos}+10^7$;$(2,r,k)$求$a_1$到$a_r$的一个不存在的值的最小值$x$使得$x\geq k$。
并且强制要求在线做。
直接用主席树在$[1,r]$中跑出一个值,然后利用set存一些被操作的值,因为被操作的值也是备选答案,两者取最小值就好,因为元素都是不重复的,所以这种方法可行。
1 |
|