
数据结构-可持久化线段树
Endless_Way
这个作者很懒,什么都没留下…
展开
-
BZOJ 2588 Spoj 10628. Count on a tree
主席树+LCA对于每个点,建一棵该点到根路径上的权值线段树,用主席树搞一搞,对于每个询问(a,b),记c是他们的LCA,d是c父亲,用siz[a]+siz[b]-siz[c]-siz[d]查找即可- -WA到吐血才发现自己lower_bound里面的cnt打成n了。。。QAQ#include<cstdio>#include<cmath>#include<iostream>#include<al原创 2016-08-25 17:25:16 · 302 阅读 · 0 评论 -
POJ 2104 K-th Number
主席树。主席树大小开太小RE了- -关于主席树大小,自己的估(口)计(胡):顺便提一下,一般对于一棵n个元素的线段树,因为线段树符合二叉树的性质,所以大小约为2∗n−12*n-1(别开这么小,一般我会开到5∗n5*n左右)对于主席树,在建树的过程中,设正在建第i棵线段树。对于i的每一层(除去第一层和最后一层),都会有两个节点是新的(不行就画图理解),一个指向i-1的对应节点,另一个自己用。所以一棵新原创 2016-08-21 15:40:02 · 325 阅读 · 0 评论 -
CF 484E Sign on Fence
可持久化线段树+二分简要题意:给出l,r,w,在[l,r]中找连续的长度为w的一段,最大化这一段中的最小值。最大化最小值,想到二分,那么check就应当是判断[l,r]内是否存在一段由大于等于二分答案的数所组成的长度≥w的连续区间。如果已经明确了这些数在哪里,这种查询是可以用线段树维护的。再考虑每一次实际上都是应用大于等于二分答案的所有数,删去小于二分答案的所有数。因此只需按数值从大到小维护可持久化原创 2017-01-14 22:05:53 · 364 阅读 · 0 评论 -
BZOJ 4556 [Tjoi2016&Heoi2016]字符串
后缀数组+可持久化线段树+二分啊啊啊智商好低,想了好久。一个直观的想法是在s[a…b]中找到和s[c…d]最接近的串,使得height最大。然而一个很烦的事情是s[a…b]存在一个右边界b,意味着我们需要min一个边界值。遇到这种min啊max啊的东西一般考虑强行分类讨论。于是二分一个答案mid,那能贡献mid答案的串开头一定位于s[a…b-mid+1]之中,那边界的条件就没了,这样就可以直接用he原创 2017-02-10 20:34:41 · 590 阅读 · 0 评论 -
BZOJ 4771 七彩树
主席树如果没有深度限制的话,显然有一种维护方式:对于每一种点,给自己+1,给同一颜色的前驱和自己的LCA-1,给同一颜色的后继和自己的LCA-1,然后查子树和。加了深度限制就坑爹了。直接用dfs序维护不了,因为询问区间不连续。考虑每一个询问,我们只希望所有深度不超过dep[x]+d的点有贡献,希望上述的维护只针对前几层的点。因此我们考虑按层来预处理信息。然后用一个能资瓷加和查的数据结构。得到算法:对原创 2017-03-16 21:42:29 · 693 阅读 · 0 评论 -
BZOJ 3489 A simple rmq problem
可持久化树套树发现这是一个多维偏序,可持久化树套树即可。#include<cstdio>#include<algorithm> #define N 100005using namespace std;namespace runzhe2000{ int read() { int r = 0; char c = getchar(); for(;原创 2017-04-27 23:42:08 · 374 阅读 · 0 评论 -
LOJ 6100 「2017 山东二轮集训 Day1」第一题
可持久化线段树+二分注意到如果[l,r]不降,[l,r-1]就肯定也不降,因此如果能对于每一个位置l,找到最远的r满足不降。这样套上主席树问题就搞定了。会降当且仅当此时异或上的a[i]的最高位恰好把当前的这一位从1变成0。因此记f[i][j][0/1]f[i][j][0/1]表示从a[1]开始异或到a[i],以j为最高位的时候,j从1变成0(或0变成1)有多少次。这样二分以后每一位都判一下即可。O(原创 2017-06-25 15:04:56 · 1198 阅读 · 0 评论