
主席树
文章平均质量分 81
cillyb
这个作者很懒,什么都没留下…
展开
-
主席树详解
看了一些博客,觉得这两篇比较好吧:点击打开链接点击打开链接(文字是复制粘贴的第二篇博客的)主席树搞了一个多星期TAT,,,,,,也只是大致领悟而已!!!主席树又称函数式线段树,顾名思义,也就是通过函数来实现的线段树,至于为什么叫主席树,那是因为是fotile主席创建出来的这个数据结构(其实貌似是当初主席不会划分树而自己想出来的另一个处理方式。。。。是不是转载 2017-07-23 15:48:55 · 4856 阅读 · 3 评论 -
POJ 2104 & HDU 2665 & POJ 2761 K-th Number (主席树入门题 区间第K大)
题意:给你n个数,m次操作,每次操作询问区间[l, r] 中第K大的数。(n、m 思路:主席树模板题 (主席树知识:点击打开链接)代码:#include#include#include#includeusing namespace std;const int maxn = 1e5+5;int a[maxn], Hash[maxn];int lson[max原创 2017-07-23 19:06:46 · 462 阅读 · 0 评论 -
ZOJ 2112 & BZOJ 1901 Dynamic Rankings(主席树 单点更新 区间第K大)
题意:有n个数,m次操作,操作有两种:Q l r k :查询区间[l, r]中第K大的数C i v :将第i个数改为v思路 :在静态主席树上增加了一个单点更新操作。见博客(点击打开链接)每次更新一个数,需要更新的是T[i], T[i+1]... ...T[n](该数所在的树以及它后面的所有树)因为每棵树T[i]所记录的都是前缀(1到i的数出现原创 2017-07-23 19:15:32 · 401 阅读 · 0 评论 -
SPOJ DQUERY(树状数组离线处理 or 主席树 区间不同数个数)
题意:n个数,m个询问,问区间[l, r]中有多少个不同的数。思路:树状数组:先将所有查询按区间右端点从小到大排序,如果一个数已经出现过就先把以前位置上的删掉然后在新的位置上插入,这样[l,r]中重复的就只计算了一次 。主席树:因为主席树同时维护好多树,所以可以在线上解决,思路与树状数组基本一模一样,如果这个数出现过,就在上次出现的地方删去,在这重新添加。树原创 2017-07-23 19:40:22 · 972 阅读 · 0 评论 -
HDU 4417 Super Mario(树状数组离线处理 or 主席树)
题意:给你n个数,m次询问,每次询问求[L, R]区间内小于等于h的数的个数。(n,m 思路:树状数组:要求比h小的,我们可以对hi和ai从小到大排序,每次都将比查询的hi小的插入树状数组或线段树,插完后询问,然后继续插入比hi+1小的,在询问........跟点击打开链接做法类似。主席树:跟求区间第k大做法一样,只需要修改一下query函数即可,类似线段树求区间和。原创 2017-07-23 21:28:05 · 602 阅读 · 0 评论 -
HDU 5877 Weak Pair (dfs 树状数组 || dfs序 主席树)
题意:给你一颗树,每个节点有一个权值,给你一个k,问你满足a[u]*a[v] 思路:做的时候看到u和v又是子树关系,想当然就是dfs序啦,然后变成a[v]树中点开),所以直接敲了dfs序+主席树。。其实这题有简单做法,我们可以在dfs整棵树过程中计算每个点作为儿子节点的贡献,贡献即为其祖先节点u, k/a[u] >= a[v]的个数。因此可以用树状数组维护从原创 2017-09-03 21:04:35 · 353 阅读 · 0 评论 -
Codeforces Round #433 (Div. 2) E. Boredom (主席树 计算矩形内点的个数)
题意:一个n*n的网格图,有n个标记,每列只有一个标记,定义美丽的矩形为以两个标记所在位置构成的矩形(对角线的两个角)。q次询问,每次询问给你一个矩形,问有多少个美丽的矩形与该矩形相交。思路:我们可以将整个图分成9个矩形:1 2 3 4 5 67 8 9假设给定矩形区域是5,且第i个矩形中含有i个标记,那么答案即为:(1*(5+6+8+9)+2*(4+5+6+7+8原创 2017-09-08 02:23:16 · 949 阅读 · 0 评论 -
51nod 1533 一堆的堆 & Codeforces538F A Heap of Heaps(树状数组||主席树)
题意:现在有一个长度为n的数组 a1, a2, ..., an 。然后对于k从1到 n-1分别对该数组建k叉堆。现在要统计对于每一个k叉堆,里面有多少结点是不满足最小堆的性质的。即值比父亲的要小的结点有多少个。k叉堆的定义是这样的:数组的下标从1到n编号,对于某一个编号为v的结点,他的k个儿子编号是 k(v − 1) + 2, ..., kv + 1 (如果其中某些编号超出n,那些编号就不原创 2017-09-21 12:48:48 · 470 阅读 · 0 评论