线段树
Master.Yi
学习他人,提升自己;
提升自己,帮助他人。
展开
-
关于线段树合并的复杂度证明
因为感觉网上的都怪怪的,所以自己yy了一下。。假设树上点数是O(n)O(n)O(n),每个点上有一些权值。每个点的权值个数之和是O(m)O(m)O(m),线段树是对权值建的。考虑一个线段树上的区间[l,r][l,r][l,r]在合并的时候,只有当两个线段树在这个区间内都有点,这个区间才会贡献 1 的复杂度。而考虑这个区间内的权值在原树上的分布,假设原树上共有kkk个点含有这个区间内的权值,容易发现最多有k−1k-1k−1次合并在两棵线段树会同时存在这个区间内的权值。(因为是树形合并)。那么这个区间总原创 2020-06-09 17:22:54 · 830 阅读 · 0 评论 -
51nod1819 黑白树 V2【树链剖分求与黑点LCA的和 + 子树黑白翻转】
题目描述:给定一棵以1为根的有根树,点可能是黑色或白色,操作如下。选定一个点x,将x的子树中所有到x的距离为奇数的点的颜色反转。选定一个点x,将点x的颜色反转。选定一个点x,询问所有黑点y(包括点x)与点x的lca(最近公共祖先)的和。 (标号)、n,m≤200000n,m\le200000n,m≤200000题目分析:这狗x数据结构写得我头皮发麻首先这个与所有黑点的LCA的标号和就很标新立异将每个点的权值记为(u−fa[u])∗子树中的黑点个数(u-fa[u])*子树中的黑点个数(u原创 2020-05-17 21:34:28 · 265 阅读 · 0 评论 -
20200428 T1 Arithmetic【Δ线段树(每个位置加的值不一样的线段树)】
题目描述:题目分析:(标题取成这样因为实在不知道叫什么好。。)不难发现我们更新线段树时需要根据每个左端点对应的Max和Min进行加减,而不是像普通的线段树那样区间整体加上一个相同的值。考虑我们的线段树需要支持什么操作,记每个位置的变化量为Δ\DeltaΔ(即当区间整体+1时这个位置需要加的量):给区间[l,r][l,r][l,r]每个位置的Δ\DeltaΔ加上一个值 xxx (可正...原创 2020-05-03 20:54:01 · 320 阅读 · 0 评论 -
模拟赛20200211「LibreOJ NOI Round #2 Day 1」
T1:题目链接大意:支持尾部插入一个正整数aia_iai,询问求f(al,al+1,...,ar)f(a_l,a_{l+1},...,a_r)f(al,al+1,...,ar),其中f(x)=x,f(a0,a1...,an)=a0+1f(a1,a2,...,an)(n≥1)f(x)=x,f(a_0,a_1...,a_n)=a_0+\frac 1{f(a_1,a_2,...,a_n)}(...原创 2020-02-11 23:18:14 · 324 阅读 · 0 评论 -
省选模拟赛第三场 T1 与非(巧妙的线段树+后缀insert优化 || 思维题)
https://blog.csdn.net/c20180602_csq/article/details/104127785转载 2020-02-01 17:16:42 · 149 阅读 · 0 评论 -
牛客CSP-S提高组赛前集训营5 C 神J上树【树链剖分+倍增/单调栈/区间取min线段树】
题目描述:链接:牛客CSP-S提高组赛前集训营5神树大人和神J来到了神仙树公园。遗憾的是,神仙树公园里没有任何神仙树,只有一棵n个点的普普通通的有根树(以1号点为根)。这棵树每条边有边权。神J打算在这棵树上来回横跳,但神J每次只能从一个节点u跳到它的子孙v,代价为u×dist(u,v)。v是u的子孙当且仅当u在v到根节点的路径上。神J提出了m个询问,每次询问两个点s,t,由于你是神树大人和神...原创 2019-11-08 10:16:19 · 450 阅读 · 0 评论 -
BZOJ4538/洛谷P3250: [HNOI2016]网络【树上不经过某点的路径的最大权值,O(1)求LCA+O(1)求树链的交+线段树二分】
题目描述:n个点的树,m次操作,每次可以加入一条权值为wi的路径(不改变树的结构,只用于询问),删除之前加入的一条路径,或者询问不经过某个点u的路径的最大权值。n<=100000,m<=200000题目分析:把权值在dfs序上赋给路径树链剖分之外的点,我们得到:比较暴力的树链剖分+线段树+堆的nlog3n做法不经过某个点,可以转化为权值>=mid的路径是否都经过这个点...原创 2019-10-25 20:48:56 · 1404 阅读 · 0 评论 -
洛谷P4198 楼房重建【线段树求前缀最大值个数】
题目描述:小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度。如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线段相交,那么这栋楼房就被认为是可见的。施工队的建造总共进行了M天。初始时,所有楼房都还没有开始建造,它们的高度均为0。在第i天,建筑队将会将横坐标为Xi的房屋的高度变为Yi(高度可以比原来大,也可以...原创 2019-10-24 21:47:05 · 436 阅读 · 0 评论 -
NOIP模拟赛20191023 T1 string【字符串排序,线段树/无旋Treap】
题目描述:给定一个由小写字母组成的字符串 s。有 m 次操作,每次操作给 定 3 个参数 l,r,x。如果 x=1,将 s[l]~s[r]升序排序;如果 x=0,将 s[l]~s[r] 降序排序。你需要求出最终序列。n<=100000题目分析:小写字母只有26种。排序相当于把区间内的所有字母拿出来,然后a,b,c,d…依次放。容易想到26棵动态开点线段树或者线段树上维护26种字母...原创 2019-10-23 23:01:58 · 553 阅读 · 0 评论 -
CodeForces #539 div1 C. Sasha and a Patient Friend【线段树】
题目描述:题目分析:把时间看做线段上的一个个格子组成,每个格子的水量变化由格子开始的水速决定。水速是很容易用线段树维护的,所以区间[l,r]的水量变化就可以维护。询问就只需要在线段树上二分就行了。具体的,线段树节点的成员是这样的(注意时间范围很大,而下面的代码并没有离散化所以是动态开点的):struct node{ int ch[2],v;//左右儿子,区间起始点的水速(只有l==...原创 2019-05-18 21:11:57 · 279 阅读 · 0 评论 -
BZOJ1095: [ZJOI2007]捉迷藏 【树上距离->括号序列+线段树】
题解戳这里#include<cstdio>#include<cctype>#include<algorithm>#define maxn 300005#define LL long longusing namespace std;char cb[1<<15],*cs,*ct;#define getc() (cs==ct&&am...原创 2019-03-28 10:22:50 · 205 阅读 · 0 评论 -
BZOJ 2243: [SDOI2011]染色 【树剖+线段树维护颜色段数】
题目传送门线段树存区间最左边和最右边的颜色,合并左右儿子的段数的时候看是否需要减1.写一个结构体重载+号似乎很方便,统计树链的时候直接加就可以了。询问的时候两条链要分别跑,不能用swap.Code:#include<cstdio>#include<cctype>#include<algorithm>#define maxn 100005usin...原创 2019-03-25 20:45:51 · 215 阅读 · 0 评论 -
BZOJ 3531: [Sdoi2014]旅行 【树剖+动态开点线段树】
今天打了多少道树剖+线段树了。。。对每种信仰,信仰地开一棵动态开点线段树。Code:#include<cstdio>#include<cctype>#include<vector>#include<algorithm>#define LL long long#define maxn 100005using namespace std...原创 2019-03-25 18:48:28 · 134 阅读 · 0 评论 -
BZOJ 2157: 旅游【树剖+线段树】
题目传送门题目分析:似乎是个裸题。。把边权放到深度大的那个点上,查询的时候去掉lca就好了。(然而我虽然知道这一点打的时候仍然把lca加进去了。。 )然后就是疯狂复制粘贴再ctrlF替换。。Code:#include<cstdio>#include<cctype>#include<vector>#include<algorithm>...原创 2019-03-25 17:19:03 · 148 阅读 · 0 评论 -
BZOJ 4127: Abs【树链剖分+(有点意思的)线段树】
题目描述:给定一棵树,设计数据结构支持以下操作1 u v d 表示将路径 (u,v) 加d2 u v 表示询问路径 (u,v) 上点权绝对值的和对于100%的数据,n,m <= 105 且 0<= d,|a_i|<= 108题目分析:有负数,统计绝对值,有区间加。注意到 d>=0 (似乎如果没有这个条件的话时间复杂度无法保证)那么对每个线段树节点...原创 2019-03-25 16:14:53 · 180 阅读 · 0 评论 -
BZOJ 3551: [ONTAK2010]Peaks加强版 【kruskal树+线段树合并】
题目描述:在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值c,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰的高度,如果无解输出-1。N<=105,M,Q<=5∗105,hi,c,x<=109。N&...原创 2019-03-25 11:02:50 · 196 阅读 · 0 评论 -
九省联考2018 IIIDX 【线段树(高级贪心???)】
题目传送门题目描述:(略)题目分析:把限制关系画出来,会发现形成了一种树形的限制关系,一个数的所有儿子是连续的。倘若di互不相同,那么容易看出这就是一个中序遍历贪心,每个点取值域末端-siz的值。但是di相同就会出问题,比如这个例子:4 2.01 1 1 2按照错误的贪心方法,流程大概是这样的:出了什么问题呢?因为第二大和第三大是相等的!也就是说二号点可以标2,四号点标3,...原创 2019-03-04 18:58:19 · 187 阅读 · 0 评论 -
BZOJ3626 LCA 【树链剖分+线段树】
题目描述:给出一个n个节点的有根树(编号为0到n-1,根节点为0)。一个点的深度定义为这个节点到根的距离+1。设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先。有q次询问,每次询问给出l r z,求∑l&lt;=i&lt;=rdep[LCA(i,z)]\sum_{l&lt;=i&lt;=r}dep[LCA(i,z)]∑l<=i<...原创 2019-02-10 17:48:45 · 225 阅读 · 0 评论 -
雅礼集训 Day5 T2 sequence
题目分析:直接在线查询显然不好处理,那么我们把询问按照右端点排序,再从左至右枚举右端点,将以当前点为左端点的k好序列的左端点值+1,查询的时候只需要统计l到r的和就行了但是暴力加1是O(n2)的,分析一下,以当前点为右端点的序列的按位与值最多只会变化log次,那么把这log个变化点找出来,如果被k整除就区间+1那么就是区间修改+区间查询,线段树维护找变化点的时候用vector很方便,每次...原创 2019-01-11 18:42:25 · 234 阅读 · 0 评论