
主席树
风中之神111
我亦飘零久
展开
-
Hdu2104(主席树)
主席树入门 可直接看上面的博客,下面的可以不看,自己总结的 主席树是一种可持久化线段树,所谓可持久化就是可保存历史版本。例如让你往权值线段树中依次插入一列数,在你插入完所有数之后询问在你插入第x个数之后所有数中第k大的是多少?这就需要你记录每个时刻的线段树,最暴力也是最容易想到的方法是每次插入一个数之前再建一棵线段树复制上一时刻的线段树,然后再在新建的树上插入。但这样不仅占很大空间还很费时间。这个...原创 2019-08-28 22:29:17 · 366 阅读 · 0 评论 -
Hdu4417_Super Mario(线段树+离线处理or划分树+二分)
题意: 给n个数,数中有重复的。有m个询问,问的是[L,R] 区间内有多少个数小于等于h 思路: 线段树+离线处理 这个题用线段树要离线处理(我试了一下在线的,超时了)。 先在原数组中存入n个高度和下标,按高度升序排序。 对于m此询问,先存储下来,注意存下标,然后按照高度升序排序。由于高度是从小到大的,没读入一个高度,在原数组里找所有比所查询高度小的,将他们在原数组中的下标置为1,然后就是线段树区...原创 2019-08-26 21:27:56 · 222 阅读 · 0 评论 -
SPOJ3267——D-query(主席树)
题意: 输入N个数字,查询区间[L,R]中有多少个不同的数字 思路: 主席树 每个位置上保存一个值。保存每个数的位置信息,如果这个数没有出现过,当前位置+1,如果出现过,将之前出现的位置-1,当前位置+1 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ...原创 2019-09-05 17:03:15 · 226 阅读 · 0 评论 -
ZOJ2112——Dynamic Rankings(动态第k小)
题意: n个数,q个询问 (n<=50000, q<=10000) Q x y z 代表询问[x, y]区间里的第z小的数 C x y 代表将(从左往右数)第x个数变成y 思路: 树状数组套主席树 先建立一颗静态的主席树,将初始值依次插入并建树。所谓静态指:可以查询,不在这颗树上进行修改操作。 对于修改操作,另外建一批主席树,每个树管理一个位置(即1-n)的权值信息,1-n位置的...原创 2019-09-08 09:08:12 · 242 阅读 · 0 评论 -
Hdu6278_Just h-index(主席树)
题意: 给n个数,q次询问,每次询问给出一个区间[l,r],要你求出最大的h,使得在[l,r]这个区间内满足,至少有h个数的值大于等于h。 思路: 主席树可以求区间[l, r]的第k小,这里改造一下,求区间[l, r]中比val小的数有多少个。 设区间内>=h的个数为w,题意是要w >= h。所以二分h,h的范围是[1, r-l+1],每次求出>=h的数有多少个,比较,继续二分。...原创 2019-09-10 20:40:50 · 278 阅读 · 0 评论 -
Hdu4348_To the moon(主席树)
题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 。 (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 。 (3)H l r t:查询时间戳t区间[l,r]的和 。 (4)B t:将当前时间戳置为t 。 思路: 对于每一次区间加法都新建节点建一棵线段树,加法不用向下更新,懒惰标记最后加上就行了,查询的话就是某个根节点的线段树...原创 2019-09-10 20:52:24 · 240 阅读 · 0 评论 -
SPOJ_10628_Count on a tree(树上第k大)
题意: 给出一棵树,树上每个节点都有权值,有m个询问,求u到v的路径上第k大的数。 思路: 树上的第k大值,跟区间第k大有些不同,区间第k大每个值在前一个值的基础上新建一棵树,而树上第k大则是在父亲节点的基础上新建一棵树,子节点的主席树都是从底下根节点累加出来的 查询的时候,答案就是root[v] + root[u] - root[lca(v, u)] - root[fa[lca(v,u)]]上的...原创 2019-09-12 19:28:40 · 252 阅读 · 0 评论