
主席树
make_it_for_good
这个作者很懒,什么都没留下…
展开
-
bzoj 4539 [Hnoi2016]树 主席树 倍增lca
把插入的树看成一个点,这个点到父亲的距离是插入树的根到父亲树的根的距离。需要建一个对于模板树的dfs序的主席树,用于找一个子树中第k大点。求两个点的距离分两个点在一棵内层树中,一个点的内层树对应的点是另一个点内层树对应点的父亲,两个点内层树的lca是另一棵内层树考虑。#include <bits/stdc++.h> using namespace std; #define ll long long原创 2016-11-03 11:03:55 · 286 阅读 · 0 评论 -
bzoj 4556 [Tjoi2016&Heoi2016]字符串 二分+后缀数组+主席树+RMQ
求一个后缀数组和height的rmq。 对rank建一个主席树。二分第二个串的匹配长度len。再二分出后缀数组中与第二个串lcp大于等于len的左右边界lq,rq。设四个点为l1,r1,l2,r2。那么第一个串只有开头为[l1,r1-len+1]的后缀可以匹配。那么如果rank[l1,r1-len+1]有在区间[lq,rq]中的,那么可行。 这个可以到主席树中查询。时间复杂度O(nlog^2)。原创 2016-11-03 11:13:46 · 321 阅读 · 0 评论 -
bzoj 3489 A simple rmq problem 可持久化树套树
设在位置x的数的前驱为pre[x],后继为nex[x] 只出现一次的数满足条件pre[x]#include <bits/stdc++.h> using namespace std; #define N 110000 #define M1 2100000 #define M2 36000000 int n,m,v1,v2,ans,lq,rq; int a[N],pre[N],nex[N],pos[N原创 2016-10-27 13:46:20 · 267 阅读 · 0 评论 -
bzoj 3673&&3674 可持久化并查集 可持久化线段树
用可持久化线段树维护可持久化数组。 按秩合并和按size合并都是把小的合到大的上。 贴一个路径压缩+按秩合并的吧(跑得最慢)#include <bits/stdc++.h> using namespace std; #define N 210000 #define M 10000000 #define ls l,mid,ch[now][0] #define rs mid+1,r,ch[now][原创 2016-10-28 11:26:46 · 233 阅读 · 0 评论 -
bzoj 3932 [CQOI2015]任务查询系统 可持久化二维线段树
好好的一道主席树被我强行套了一层。。。 然后MLE+TLE,然后我惊奇地发现区间的sum只要开int就行了。。。我的做法: 一个点需要满足si<=x且ei>=x,然后求满足这个条件的pi前k小的点的和。 那么对si排一遍序,把所有点按ei第一维,pi第二维插入可持久化二维线段树。。。。正常的做法: 对于一个点,在si时+1,ti+1时-1,然后按这个建主席树。#include <bits/s原创 2016-10-29 16:34:47 · 395 阅读 · 0 评论 -
bzoj 2588 Spoj 10628 Count on a tree 树链剖分 主席树
主席树维护树链剖分裸题。 最后换行会PE。。。#include <bits/stdc++.h> using namespace std; #define N 110000 #define M 7100000 #define ll long long int n,m,tot,num,cnt,ans; int a[N],b[N],head[N],nex[N<<1],to[N<<1]; int fa[N原创 2016-10-20 19:04:45 · 302 阅读 · 0 评论 -
bzoj 2653 二分+主席树
这个东西可以二分答案,设当前答案为x,那么将序列中大于等于x的数设为1,小于x的数设为-1。 这样如果一个区间的和≥0\ge0,那么这段区间的中位数≥x\ge x。、 因此只需要求最大连续子段和是否大于等于0就可以了。 最大连续子段和可以用线段树求。 不过对于每一个二分的答案都需要一个线段树。 由于当答案增加时线段树上只有一个点的值改变,因此可以用可持久化线段树维护。#include <b原创 2016-10-21 08:53:57 · 274 阅读 · 0 评论 -
bzoj 2006 [NOI2010]超级钢琴 二分答案 可持久化线段树
大家好,这里是一个log^2的智障。 看到第K大直接想到二分答案+主席树,主席树维护区间的个数和区间的和。良心BZ测总时限竟然16s过了。。。 原来正解就是主席树套个堆。。。#include <bits/stdc++.h> using namespace std; #define N 1010000 #define M 20000000 #define ll long long #define原创 2016-12-27 18:18:56 · 361 阅读 · 0 评论