主席树
文章平均质量分 56
pbihao
这个作者很懒,什么都没留下…
展开
-
【BZOJ 2653】middle 主席树好题推荐
谈谈这一道题的最强烈的感受在于,我的主席树入门是经典题目区间第k大树查询(当然,因为poj上不会强制在线,还用树套树和整体二分写过那道题),因此,对于主席树的理解仅仅是一个区间历史版本维护的理解,即类似于树套树的外层区间树内层全值树。但是忽略了主席树的真正伟大之处在于可持久化,而可持久化的也能是权值。对于这一道题,由于我们不知道中位数是多少,因此考虑二分,而关键之处在于如何二分cheak,可以原创 2016-12-25 21:36:18 · 530 阅读 · 0 评论 -
【BZOJ 3439】Kpm的MC密码 主席树+trie树
所有的串都倒着插然后后缀变前缀,然后用主席树维护dfs序查询子树第k大就好了,唯一就是注意一下肯呢过有重复的串#include#include#include#include#define maxn 100021using namespace std;vectorg[maxn*20];int ch[maxn*20][26],in[maxn],out[maxn],tot,cnt,c原创 2017-02-27 08:10:55 · 251 阅读 · 0 评论 -
[BZOJ 4571][scoi2016]美味 主席树
从高到低按位贪心,对于原来的数列建立权值主席树,每一次贪心的算出区间范围然后主席树查询有没有这个区间有没有这个值,然后就没有了#include#include#include#define maxn 200021using namespace std;int read(){ char c=getchar();int x=0; for(;c>'9'||c<'0';c=getchar原创 2017-03-02 09:53:24 · 360 阅读 · 0 评论 -
【BZOJ 4539】[Hnoi2016]树 倍增lca+主席树
其实思想特别简单,首先我们是不可能真的把一颗子树全部弄过去的,所以只能把一个根节点代表一个子树连入新的树中。1.如何找到新树节点对应的原树节点编号。对于原来的模板树用主席树维护dfs序,每次先二分出这个节点在哪一次操作是添加的,找到原来的子树根节点,然后用主席树查找区间第k大就好了。2.新树求距离两种情况,要么在同一次添加的,直接在原树上做,否则倍增到新树的lca上,计算得到。原创 2017-02-13 18:41:23 · 267 阅读 · 0 评论 -
[BZOJ 3772]精神污染 主席树+dfs序
这题目描述是真...精神污染..比较有趣的一道题目,首先显然ans=所有两两之间有包含关系的路径/所有的方案数那么,现在问题就变成了如何快速的找到有包含关系的路径.假设现在有路径A以及路径B,切A包含于B,那么显然A的两个端点都在B这条路径上,也就是说我们只需要找到所有起点和终点都在B路径上面的路径.这里由于路径很难维护,所有就维护当前节点到根节点的信息.主席树维护dfs序(每原创 2017-03-01 11:09:21 · 263 阅读 · 0 评论 -
【BZOJ 4299】 Codechef FRBSUM 主席树
一个显然的性质:如果之前可以组成前mx个数,那么可以新加入一个max+1则对当前无贡献但是。。。推出这个性质后面我就没想到了。。。。其实,每当我们得到一个mx以后,因为小于等于mx+1的数都可以和mx构成一个新的mx,因此新的mx=sum[mx+1],sum表示小于等于mx+1的前缀和,而这样每一次都至少增加一倍所以最多log次,主席树维护前缀和就好了#include#include原创 2017-02-17 18:54:43 · 445 阅读 · 0 评论 -
【BZOJ 3545】 [ONTAK2010]Peaks 最小生成树+kruskal重构树
一个很显然的道理就是所有的边权中只有最小生成树上的边是有用的对吧(如果当前最小的边权都不能满足,再大一点就更不能了)。所以一开始把最小生成树做出来,然后用kruskal重构树,最后直接用主席树维护这个重构树,查询第k大就好了。#include#include#include#include#define maxn 300200#define maxm 5000200using na原创 2017-01-18 13:09:16 · 270 阅读 · 0 评论 -
【BZOJ 3207】花神的嘲讽计划Ⅰ 主席树e
长度给定,原串最多有n-k+1个hash值,预处理出来。对于每一次的询问就是询问一段区间是否出现这个hash值,莫队,主席树都能搞,这里我用主席树。这种判断一个串是否出现过hash是常用处理方法#include#include#include#include#define maxn 100021#define LL unsigned long longusing namespa原创 2017-02-16 11:40:33 · 248 阅读 · 0 评论 -
【BZOJ 3585】mex 主席树
维护每一个权值最后一次出现的位置,当l->内小于x的权值最后一次均出现在l左侧x可行,然后树上二分,因为要储存历史版本,所以用主席树。#include#include#include#define maxn 200021using namespace std;int n,ls[maxn*34],rs[maxn*34],rt[maxn],tot,Min[maxn*34],m;void原创 2017-02-07 21:36:35 · 391 阅读 · 0 评论 -
【BZOJ 2223】 [Coci 2009]PATULJCI 主席树
刷水有益健康#include#include#include#define maxn 6000020using namespace std;int m,n,rt[maxn],sum[maxn],tot,ls[maxn],rs[maxn],c;void insert(int x,int& y,int l,int r,int id){ y=++tot;ls[y]=ls[x],rs[y原创 2017-01-14 10:52:55 · 238 阅读 · 0 评论 -
【BZOJ 3123】[Sdoi2013]森林 启发式合并主席树
//如题#include#include#include#include#define maxn 500020using namespace std;int read(){ char c=getchar();int f=1,x=0; for(;c>'9'||c<'0';c=getchar())if(c=='-')f=-1; for(;c='0';c=getchar())x=x原创 2017-01-03 22:24:43 · 225 阅读 · 0 评论 -
【BZOJ 3524】[Poi2014]Couriers 主席树裸题
放松一下,直接树上二分就好了。#include#include#include#define maxn 500020using namespace std;int n,m,ls[maxn*20],rs[maxn*20],s[maxn*20],num,rt[maxn];void insert(int x,int& y,int l,int r,int id){ y=++num;ls原创 2017-01-03 21:20:17 · 509 阅读 · 0 评论 -
【BZOJ 2588】Spoj 10628. Count on a tree 主席树+树上差分
其实感觉主席树最有意思的地方就在于其历史版本维护的到底是什么东西。维护每个节点到根节点之间的信息,这个可以用主席树搞,然后每次查询的时候就用sum[ls[a]]+sum[ls[b]]-sum[ls[lca(a,b)]]-sum[ls[fa[lca(a,b)]]]就是树上差分啦。。#include#include#include#include#define maxn 20002原创 2017-01-03 09:42:23 · 247 阅读 · 0 评论 -
【BZOJ 3439】Kpm的MC密码 主席树+trie树
所有的串都倒着插然后后缀变前缀,然后用主席树维护dfs序查询子树第k大就好了,唯一就是注意一下肯呢过有重复的串#include#include#include#include#define maxn 100021using namespace std;vectorg[maxn*20];int ch[maxn*20][26],in[maxn],out[maxn],tot,cnt原创 2017-02-27 10:11:18 · 183 阅读 · 0 评论