随笔分类 - 数据结构——主席树
摘要:题目链接 思路 对于每一种颜色都建立一个动态开点线段树。然后每次查询的时候就去这个颜色的线段树上查询就行了。修改之后不要忘记交换颜色。 这个题目数据有点强。抄了个比较快的读入优化才卡过去。 代码 cpp / @Author: wxyww @Date: 2018 12 13 08:59:51 @Las
阅读全文
摘要:可持久化线段树 可持久化线段树就是支持历史版本的查询和修改的线段树。主席树就是可持久化线段树的一种 思想 如果正常情况下我们想要保留每个历史版本的话。那么假如有n次操作,就要搞n棵线段树。 但是我们发现,第i棵与第i 1棵线段树的大部分节点都是相同的,那么可不可以共用这些节点,从而减小时空复杂度呢。
阅读全文
摘要:题目链接 思路 查询区间第k小,考虑主席树。因为是从u到v的简单路径上,考虑将路径分为从u到lca和从lca到v两部分。所以对于每个点都维护出从根节点到当前节点中的点。查询的时候只要用ans[u] + ans[v] ans[lca] ans[fa[lca]]就行了。也就是在主席树的查询代码上略加修改
阅读全文
摘要:题目链接 思路 观察这个$(r l + 1)/2$,很容易证明,如果一个数出现次数大于$(r l + 1) / 2$,那么这个区间内第$(r l + 1) / 2 + 1$大一定是这个数。所以只要用主席树查询出区间内第$(r l + 1) / 2 + 1$大,然后再去查这个数在这个区间内出现次数,就
阅读全文
摘要:题目链接 思路 裸的主席树。查询的时候,通过相减求出区间内左子树中数的个数a。然后判断要查找的k是否比这个z要大。如果比这个值大,那么就去右子树中查找第k z大,否则去左子树中查找第k大。 代码 cpp / @Author: wxyww @Date: 2018 12 11 16:27:19 @Las
阅读全文