主席树
Cyhlnj
这个作者很懒,什么都没留下…
展开
-
Bzoj2588 Count on a tree
离散化 主席树 每个点记录它到根的路径上的点 查询时u,v,lca,fa[lca]组合起来计算即可# include <bits/stdc++.h># define IL inline# define RG register# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long l原创 2017-12-23 11:22:39 · 244 阅读 · 0 评论 -
SPOJ3267:D-query
题面SPOJ3267Sol给定NNN个正整数构成的序列,将对于指定的闭区间查询其区间内的不同的数的个数主席树 不是权值线段树 维护位置 如果插入一个数时发现之前有过了 那么修改当前的,那个位置−1−1-1 然后插入这个数字,在相应的位置+1+1+1# include <bits/stdc++.h># define RG register# de...原创 2018-02-28 21:01:13 · 288 阅读 · 0 评论 -
主席树乱讲
主席树乱讲前置技能线段树:动态开点,标记永久化,基本操作离散化介绍主席树即可持久化线段树,也叫作函数式线段树 至于为什么叫做主席树,据说是一个叫HJT的神犇在考场上现场yy出来的 可持久化线段树: 顾名思义就是线段树经过了若干次修改之后,仍然能找到原来某次修改前的线段树的信息的一种数据结构建立最暴力的方法就是,每次修改就复制当前的线段树新建下一版本的...原创 2018-02-28 21:52:10 · 904 阅读 · 3 评论 -
HDU5919:Sequence II
题面VjudgeSol给一个数列,有m个询问,每次问数列[l,r]区间中所有数的第一次出现的位置的中位数是多少,强制在线主席树 询问区间内不同的数的个数 树上二分找到那个中位数# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b) memset(a...原创 2018-02-28 22:41:35 · 202 阅读 · 0 评论 -
CF484E Sign on Fence
题意给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值Sol二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于它为1 那么就是求区间最大的1的序列长度大于k 二分的最优答案一定在这个区间内,否则不优 排序后就是用主席树优化空间 之前buildbuildbuild一下,因为区间有长度不好...原创 2018-03-01 17:52:00 · 232 阅读 · 0 评论 -
CF813E Army Creation
题意nnn个数a[i],qa[i],qa[i] ,q次询问,n,a[i],q<=105n,a[i],q<=105n,a[i],q[l,r][l,r][l,r]内最多可以选多少个数,满足同一个数的出现次数不超过kkk 强制在线Sol处理出每个数往前数第k+1k+1k+1个与它相同的位置 没有则为000 那么就是求区间内所有的该值小于lll的数 主席树来做就好了...原创 2018-03-11 22:12:24 · 174 阅读 · 0 评论 -
Bzoj2653: middle
题面传送门Sol丽洁姐的题目还是棒棒的 考虑二分答案 Check?Check?Check? 把小于它的设为−1−1-1,大于等于它的设为111 [a,b][a,b][a, b]求一个最大后缀子段和 [c,d][c,d][c, d]求一个最大前缀子段和 [b+1,c−1][b+1,c−1][b+1, c-1]求一个和 加起来如果大于等于000,那么满足要求,这个数还可以...原创 2018-03-12 20:38:57 · 161 阅读 · 0 评论 -
Bzoj3551: [ONTAK2010]Peaks加强版
题面题目传送门在BytemountainsBytemountainsBytemountains有NNN座山峰,每座山峰有他的高度hihih_i 有些山峰之间有双向道路相连,共MMM条路径,每条路径有一个困难值,这个值越大表示越难走 现在有QQQ组询问 每组询问询问从点vvv开始只经过困难值小于等于xxx的路径所能到达的山峰中第kkk高的山峰,如果无解输出−1−1-1 N<=1...原创 2018-03-13 17:44:54 · 277 阅读 · 0 评论 -
Bzoj4556: [Tjoi2016&Heoi2016]字符串
题面传送门Sol二分这个最长前缀的长度 考虑checkcheckcheck首先s[a..b]s[a..b]s[a..b]以iii开头子串如果要满足和s[c..d]s[c..d]s[c..d]的LCP>=midLCP>=midLCP>=mid 那么iii肯定是在后缀数组的rankrankrank的一个区间内 这个区间显然可以二分/倍增出来iii同时还要满足b...原创 2018-04-11 13:57:53 · 250 阅读 · 0 评论 -
SPOJ:To the moon
题面vjudgeSol主席树模板# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;const int _(1e5...原创 2018-02-27 22:38:50 · 218 阅读 · 0 评论 -
Bzoj3514: Codechef MARCH14 GERALD07加强版
题面传送门Sol首先每次加入边的两个点不联通,那么联通块的个数就要减1" role="presentation">111 那么考虑怎么做 莫名想到LCT" role="presentation">LCTLCTLCT 然后就不会了。。。 orz" role="presentation">orzorzorz题解 维护一个每条边的数组,如果这个点加入后形成环,那么就把这个数组设原创 2018-01-28 22:37:32 · 238 阅读 · 0 评论 -
[POI2014]KUR-Couriers
题意给一个数列,每次询问一个区间内有没有一个数出现次数超过一半题解主席树,一个数出现次数>一半,这个区间内只有这一个数满足,那么主席树直接维护所有数的出现次数,直接在树上二分查询# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))us原创 2017-12-25 20:47:25 · 249 阅读 · 0 评论 -
[CQOI2015]任务查询系统
把一个任务拆成两个,在s时加入,在e+1时减去即可 直接离散化后上主席树# include <bits/stdc++.h># define IL inline# define RG register# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;const int _原创 2017-12-27 15:27:08 · 247 阅读 · 0 评论 -
[SDOI2010]粟粟的书架
前50分就开两个数组,一个sum[i][j][k],表示1,1到i,j大于k的和,num[i][j][k]表示个数,二分一下就好 后50分用主席树,主席树上二分# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using name原创 2018-01-04 18:41:12 · 323 阅读 · 0 评论 -
Bzoj2006: [NOI2010]超级钢琴
题面传送门Sol求前缀和之后,每次枚举左端点,找到相应的区间最大值,丢到堆里面 每次取出一个就拿出来找下一个最大值再丢进去 那么就是要求区间第kk大,主席树就好了 因为数组开小了和没开longlong,WA无数遍 我太菜了太菜了太菜了# include # define IL inline# define RG register# define Fill(原创 2018-01-23 10:28:09 · 192 阅读 · 0 评论 -
[SCOI2016]美味
按位从高往低贪心,枚举到第i位,只需要判断这2^i长度的区间是否有菜,用主席树就可以了# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;const原创 2017-12-30 14:41:31 · 271 阅读 · 0 评论 -
[SDOI2013]森林
主席树 离散化后 每个点储存从根到它的路径上的点权 新加边时直接用启发式合并,直接把size小的重构 询问时sum[u]+sum[v]-sum[lca]-sum[fa[lca]]来比较,在树上二分 LCA用倍增求,在启发式合并时暴力更新 连通性用并查集维护,再维护每个联通快的size 空间开大点就可以过了# include <bits/stdc++.h># define IL inl原创 2017-12-26 19:42:20 · 226 阅读 · 0 评论 -
Bzoj1901 Dynamic Ranking
动态区间第k小那么每个点开一棵线段树(主席树)再套一个树状数组在外面每次询问区间内的树的个数时 相当于进行了一次树状数组求区间和的操作,只是是把树状数组那个点看做主席树,对log棵主席树求区间和然后每次询问,修改时就是把log棵主席树同时跳到儿子,修改也是log棵时间复杂度O(nlogn*logn)空间复杂度O(nlogn*logn)# include <bits/stdc++.h># defi原创 2017-12-23 11:09:42 · 244 阅读 · 0 评论 -
[HNOI2015]开店
如果没有年龄区间 画图发现ans=∑ni=1disi+n∗disu−2∗∑ni=1dislca(i,u)\sum_{i=1}^n dis_i + n * dis_u - 2 * \sum_{i=1}^{n} dis_{lca(i, u)}对∑ni=1dislca(i,u)\sum_{i=1}^{n} dis_{lca(i, u)}用树链剖分,对于每个点,都向上走到根,记录每条路经过次数,询问原创 2018-01-06 08:21:09 · 309 阅读 · 0 评论 -
BZOJ4771: 七彩树
传送门考虑维护每个颜色的虚树按照 dfndfndfn 顺序维护这些点,在这些点上 +1+1+1,相邻点的 lcalcalca 处 −1-1−1,这样,无论包含哪一个子树的几个点,子树权值和始终为 111可以用 set+LCAset+LCAset+LCA 实现现在变成了二维数点的问题,按照深度依次加入每个点用主席树维护,每个线段树维护 dfsdfsdfs 序即可# include <...原创 2019-01-16 10:30:52 · 249 阅读 · 0 评论