主席树
EMber _
人但有追求,世界亦会让路。
展开
-
51nod 1681 公共祖先 主席树dfs序
有一个庞大的家族,共n人。已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边)。 在另一个未知的平行宇宙,这n人的祖辈关系仍然是树形结构,但他们相互之间的关系却完全不同了,原来的祖先可能变成了后代,后代变成的同辈…… 两个人的亲密度定义为在这两个平行宇宙有多少人一直是他们的公共祖先。 整个家族的亲密度定义为任意两个人亲密度的总和。 Input 第一行一个数n(1<=n<=100000原创 2017-02-27 22:27:38 · 261 阅读 · 0 评论 -
bzoj2006 [NOI2010]超级钢琴 堆+ST表/主席树
题意:Y sera 陷入了沉睡,幻境中它梦到一个长度为N 的序列{Ai}。 对于这个序列的每一个子串,定义其幻境值为这个子串的和,现在Y sera 希望选择K 个不同的子串并使得这K 个子串的幻境值之和最大。 然而由于梦境中的种种限制,这些子串的长度必须在L 到R 之间。 你需要告诉她,最大的幻境值之和。比赛题目的描述直接拿过来用了。 很久之前做的一道题目,所以没有第一时间认出来,而且当时也原创 2017-10-21 16:10:34 · 342 阅读 · 0 评论 -
bzoj2453&2120 维护队列 可修改莫队算法/树套树
题意:给你一个序列,要求区间内不相同数字个数,单点修改。 第一眼感觉就是裸的树套树啊,然后看了看题解woc怎么都是莫队啊。 算了反正就算复习莫队吧= =我也好久没打了。觉得hzwer的那个方法不算普遍,candy?的方法应该是更加模板化的吧,10^6直接记录每个颜色数量以后更新,可修改和不可修改其实没太大差别,就是要多记录一个时间还有每一次修改之前的值,这也就意味着你要把修改和询问区分开来(好像原创 2017-09-20 18:29:07 · 275 阅读 · 0 评论 -
5333. 【NOIP2017提高A组模拟8.23】大新闻 主席树/树套树
数据结构学傻选手。。。 题意:给出一个序列,每次可以在开头添加或删除,以及查询区间k大。一看添加无脑树套树,成功fst,事实上只要一个主席树就可以了,倒过来每次覆盖掉。。#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int n,m,tot,top,sz;const int N=5e5+5;原创 2017-08-23 14:44:32 · 279 阅读 · 0 评论 -
5296. 【清华集训2017模拟】Sequence 树套树
题意:给你一些二元组如(ai,bi)(ai,bi),每次询问l,r,x,y,k. 先把元素按照第一关键字排序,取出其中排名为x,y的,按照第二关键字排序后取出排名为k的元素。树套树很明显了其实。。 对于第一个操作,我们对于a维护一颗主席树,取出第x,y的端点,然后在外层主席树中把第x到y中的节点信息取出来然后做个线段树区间k大就好了。。#include<cstdio>#include<algo原创 2017-08-20 16:01:46 · 159 阅读 · 0 评论 -
codeforces 484E Sign on Fence
题意:给你一段序列,每次给你一个询问l,r,w。问你l到r之间值大于等于w的最长连续区间是多大。分析:可以通过二分高度来判断。 显然最终的答案是数组里面的某一个值,那么我们可以把整个序列从大到小排序,然后每个数建一个线段树,a[i]的叶子节点中比他大的就为1否则为0,那么很明显答案就是求连续为1的最大长度,就转化成了经典线段树问题。但是我们不可能建10^5颗线段树,那么可持久化一下就行了。#inc原创 2017-02-23 16:29:41 · 228 阅读 · 0 评论 -
bzoj4756[Usaco2017 Jan]Promotion Counting 树上主席树
比较简单的树上主席树,对于整一颗子树,用dfs序把他延伸成序列然后直接查询就好了#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using n原创 2017-06-08 22:40:03 · 335 阅读 · 0 评论 -
bzoj2588Spoj 10628. Count on a tree 树上主席树
比较经典的树上主席树,然而改了半天,tmd发现线段树开大了导致TLE?????这TM都能T?醉了,虽然我知道开大空间可能会T,但没想到有一天自己亲身成为实验体QAQ。。跟普通的主席树其实没什么区别,就是在树上扫一遍顺便建权值线段树,然后最后求答案是sum[x]+sum[y]-sum[lca]-sum[fa[lca]]这个已经老生常谈了就不解释了。#include<cstdio>#include<c原创 2017-06-08 21:26:52 · 811 阅读 · 0 评论 -
bzoj1901Zju2112 Dynamic Rankings 带修改可持久化线段树
裸的带修改主席树,套个树状数组。 所以也勉强算是个树套树,嘛不过树套树也能过就是了。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;co原创 2017-06-08 17:02:23 · 413 阅读 · 0 评论 -
bzoj3110[Zjoi2013]K大数查询 主席树套线段树
题意很简单,就是带修改的K大数查询。 查询自不用说,怎么修改? 由于数字都在1-n范围内,所以他的权值就是他的排名,直接插入,然后建立区间线段树,在线段树内找到修改的范围,然后用主席树区间修改。 因为多打两个else而调了一上午的sb。。。 权值线段树本来也可以,但是数据加强以后被卡了。#include<cstdio>#include<cstring>#include<algorithm原创 2017-06-08 11:12:46 · 498 阅读 · 0 评论 -
bzoj4826 [Hnoi2017]影魔
分析:直接贴题解了: 对每个点i,单调栈求出左边和右边第一个大于i的位置,记为l[i]和r[i] 那么(l[i],r[i])会产生p1的贡献 左端点为l[i],右端点在[i+1,r-1]的点对都会产生p2的贡献(原来题解笔误了) 右端点为r[i],左端点在[l+1,i-1]的点对都会产生p2的贡献 将点对看成平面上的点,横坐标左端点纵坐标右端点,上述贡献分别对应单点加(p1)和线段加(p2原创 2017-04-19 20:37:56 · 1077 阅读 · 0 评论 -
bzoj3673&3674 可持久化并查集
题意如题。。。分析:可持久化并查集可以用主席树维护一下就行了。具体的就是在树上维护fa,然后记得按秩合并。。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=原创 2017-02-24 21:17:09 · 222 阅读 · 0 评论 -
bzoj3585 mex
题意就是题目。分析:直接上主席树,存储每个数出现的最右位置。。随便做。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namesp原创 2017-02-23 22:00:12 · 264 阅读 · 0 评论 -
bzoj2223 [Coci 2009]PATULJCI
题意就不说了。。直接上主席树。。无脑。。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,原创 2017-02-23 17:22:26 · 341 阅读 · 0 评论 -
poj2104
主席树模板复习。。。。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,m,q;type原创 2017-02-22 21:54:56 · 245 阅读 · 0 评论 -
bzoj2006NOI2010超级钢琴 主席树+优先队列
题意就不说了。 我一开始想的是把每一位看做最后的节点,然后二分这个点做为右端点的序列长度,用主席树随便维护一下。然而这个序列不是有序的,不满足二分性。。 我们用优先队列处理一下,同样是把每个端点看作右端点,然后在i-r-1到i-l这段区间里找K小,用优先队列记录一下,找到k个就结束了,时间复杂度klogn。code(万年RE):#include<bits/stdc++.h>#define fo原创 2017-03-01 22:09:50 · 341 阅读 · 0 评论 -
bzoj3123 【SDOI2013】森林 启发式合并
Description小 Z有一片 森林 ,含有 N个节点, 每个 节点上都有一非负 整数作为 权值 。 初始的时候, 森林中有 M条边。小 Z希望 执行 T个操作 ,操作有两类:1、Q x y k 查询 点 x到点 y路径上 所有的 权值 中, 第 k小的权值是多少。 此 操作保证点 x和点 y连通,同时这两个节点的路径上至少有 k个点。2、L x y 在点 x和点 y之间连接一条边。保证完成此操原创 2017-02-28 17:04:42 · 310 阅读 · 0 评论 -
bzoj1878 [SDOI2009]HH的项链 主席树
题意:求区间不同自然数个数。 主席树裸题,记录一下last[a[i]]表示上一个数出现的位置,然后用主席树预处理差分一波,接着就可以直接做了。 还要在细一点的话,就是说,我在i这个位置上把ai加上去,然后在last[a[i]]的地方把它减掉。。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(原创 2017-10-23 22:19:33 · 378 阅读 · 0 评论