![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构--线段树
没4年
这个作者很懒,什么都没留下…
展开
-
A.The beautiful values of the palace 扫描线+思维题
A.The beautiful values of the palace题解:一个螺旋矩阵,我们要O(1)处理处每个位置数的值,所以必然要找规律,O(1)求每个值。规律就是首先判断点在哪一层螺旋,然后再根据等差求和,因为每一层的数的个数都是有规律的,然后再判断在哪一条边上,然后就能O(1)求。然后我按照x从小到大,按照y从小到大,按照先修改再查询的顺序,但是要注意这里需要二维求前缀和的知识,我们...原创 2019-11-05 15:30:15 · 101 阅读 · 0 评论 -
A. Lightning Routing I 线段树维护树直径
A. Lightning Routing I题意:带修改的边权树,查询给定点到任意点的最远距离。题解:首先我们树直径的合并,两颗子树合并后,新的树直径端点在原理两颗子树的树直径端点产生。那么我们就要查询任意树上两点之间的边权,需要一颗边权线段树,然后维护一颗树直径线段树。注意:qu_path()函数中,更新区间最后左区间+1。#include<bits/stdc++.h>#d...原创 2019-10-26 12:27:00 · 305 阅读 · 0 评论 -
P2617 Dynamic Rankings 树套树模板题
P2617 Dynamic Rankings题解:树套树,动态开点线段树套树状数组,这题离线写,要离散化,直接看代码,没什么好说的。#include<bits/stdc++.h>#define m (l+r)/2#define low(x) x&-xusing namespace std;const int maxn = 1e5+10;struct node {c...原创 2019-10-23 18:31:22 · 97 阅读 · 0 评论 -
I. Yukino With Subinterval 树套树入门题
I. Yukino With Subinterval题意:有两种操作,第一种修改一个位置的值,第二种求给定区间[l,r]内有多少合法区间。合法区间定义:al = al+1 = … = ar ,且该区间为最长。题解:如果这题不带修改,主席树就写完了。那么带修改动态开点线段树套树状数组。注意:这题卡常,需要快读。#include<bits/stdc++.h>#define m (...原创 2019-10-22 15:38:40 · 162 阅读 · 0 评论 -
E. Let Them Slide 线段树骚操作
E. Let Them Slide题意:就是每行可能有可滑动的一行数据,询问每列的最大和。题解:我们维护一行数据的每个位置对固定一行位置的贡献,可滑动的数据可以对固定的多个位置有贡献,所以我们维护一颗可以区间更新最大值和最小值的线段树,然后再维护一个sum[o]数组,代表那一段区间的最优解sum[o]当mx[o]==mn[o]时就停止向下更新了,因为如果mx[o]==mn[o]就代表那个区间的...原创 2019-10-20 00:23:10 · 180 阅读 · 0 评论 -
D. Balanced Playlist 线段树+二分
D. Balanced Playlist题解:我们二分每个位置,以该位置为左端点,二分他最左边的右端点使得这一段区间合法。首先这一段区间的值没有单调性,所以我们无法直接用线段树来找到每个位置最左边的右端点,但是我们可以用线段树来检测这一段区间是否合法。#include<bits/stdc++.h>#define ll long long#define m (l+r)/2#de...原创 2019-10-18 15:36:10 · 112 阅读 · 0 评论 -
F.DFS dfs序+线段树
F.DFS题意:给你一颗初始树,然后两种操作,一个是原来两个点没有边然后加边,另外一个是两个点有边,删除边(不包括初始树边)。问你每次操作后,有多少个合法的点。合法点的定义:以这点为dfs的起点建出来的树与初始树是否不一样,如果每次都是不一样的,那么这就是不合格的点,否则就是合格的点。题解:我只要求得x,y这个环,不包括x,y内的所有点,和与环内点相连的点,都是不合格的点,我用总数减去不...原创 2019-10-14 13:23:34 · 149 阅读 · 0 评论 -
E Grid 动态开点线段树
E.Grid题解:这题巨水,思维难度为0,但是卡空间,你自然想到离散化,离散化肯定能过,但这题不用离散化也能过,但是你要防止递归层数过多,就要减少递归次数,具体看代码实现。#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 1e6 * 5 ;ll n,m;int t...原创 2019-10-11 20:33:08 · 271 阅读 · 0 评论 -
J 买一送一 主席树
J买一送一题意:给你一个树,每个节点都有权值,求由根节点到每个叶子节点能够有效的有序(x,y)的对数,有先后顺序。题解:很容易出思路,我在树上建主席树,直接上代码。注意:就是去重不是那么容易,你对一条链上的每个点,如果一个数出现两和出现两次以上是不一样的,还有就是同一个数,对于两条树链是不一样的。#include<bits/stdc++.h>#define ll long l...原创 2019-10-10 23:41:19 · 116 阅读 · 2 评论 -
H 千万别用树套树
H.千万别用树套树题意:有两种操作,第一个插入一个[l,r]的线段,第二个是查询包含[l,r]的线段个数。题解:由于对于查询r-l<=2,所以这道题很简单,用线段树维护每个线段树的端点,然后我要查询的线段等于总的线段总数-不合法线段树总数。不合法线段在我维护这个线段树看来就是我查询[l,r],那么不合法的就是对于左端点查询[l+1,n]内有多少个点,同理对于右端点查询[1,r-1]内有多...原创 2019-10-07 20:47:05 · 278 阅读 · 0 评论 -
dfs序+线段树入门题
E. Company题意:给你一颗树,有q次查询,每次查询一个区间[l,r],询问你删除其中的一个节点使得删除后节点的lca最大,输出要删除的节点和lca的深度。题解:简单讲一下dfs序,其实就是你搜索树的先后顺序,然后这题你只要考虑一段区间dfs序最大和最小的节点会对lca产生影响,这很好理解,那么我们只需要用线段树维护一下这些点的dfs序,求个最大次大,最小次小,就解决了。#includ...原创 2019-10-06 21:25:37 · 427 阅读 · 0 评论 -
动态开点线段树+lz更新
[题目链接] (https://codeforc.es/contest/500/problem/E)题解:维护每个木块能够覆盖的区间。#include<bits/stdc++.h>#define mid (l + r) / 2using namespace std;const int maxn = 2e5 + 10, N = 1e9;int ls[maxn * 31], r...原创 2019-09-20 14:44:56 · 170 阅读 · 0 评论 -
可持续化线段树
[题目链接] (http://acm.hdu.edu.cn/showproblem.php?pid=2665)题解:主席树模板题,区间第K大。此题需要离散化。#include<bits/stdc++.h>using namespace std;const int maxn = 1e5+10 , N = 1e9;int rt[maxn] , sum[maxn*18] ,ls[m...原创 2019-09-20 14:48:01 · 149 阅读 · 0 评论 -
可持续化线段树应用
[题目链接] (https://nanti.jisuanke.com/t/41391)题解:以每个位置建树,维护每个位置之后每个合法的位置加入线段树中。#include<bits/stdc++.h>#define mid (l+r)/2using namespace std;const int maxn = 1e5+10;vector<int>G[maxn];...原创 2019-09-20 14:51:48 · 125 阅读 · 0 评论 -
可持续化线段树好题
[题目链接] (https://ac.nowcoder.com/acm/contest/1083/F)题解:这题如果不连边的话,就只需要用普通线段树来维护就行了,注意递推关系,如ABCBA可以由AB和CBA组成,但是你同时还要递推AB,所以需要递推所有的关系。那么这题加边了,就用可持续化线段树来维护,如果不知道可持续化线段树,建议先学习。那么这道题我们只需要找到查询的两个节点的公共祖先,然后分别...原创 2019-09-23 00:08:30 · 176 阅读 · 0 评论 -
离散化线段树
[题目链接] (https://ac.nowcoder.com/acm/contest/887/E)题解:这题如果不卡空间的话,那么直接动态开点的水题,如果卡空间,离散化一下,在建线段树,再lz更新一下,注意离散化后与原来的数据的操作是有差距。#include<bits/stdc++.h>#define m (l+r)/2#define ls o*2#define rs o*...原创 2019-09-23 20:06:30 · 258 阅读 · 1 评论 -
动态开点线段树好题(推荐)
[题目链接] (https://acm.xylab.fun/judge/problem/view/1028)题意:对于一个1-n的序列,有两种操作,第一种更改一个位置的值第二种就是查询[l,r]里x出现奇数次的子区间的个数。题解:我们对每个位置的数建一颗区间01线段树,那么我们动态开点,注意这里有多个根,也就是说有很多颗线段树。那么我们可以维护五个值:val,len,sumL,sumR,sum...原创 2019-09-26 23:12:38 · 1084 阅读 · 0 评论 -
2018-2019 ACM-ICPC, Asia Shenyang Regional Contest E题
E. The Kouga Ninja Scrolls题解:前置知识曼哈顿距离与切比雪夫距离的转化,定义两点(x1,y1),(x2,y2)之间曼哈顿距离为 | x1 - x2 | + | y1 - y2 | ,它可以转化为求(x1+y1,x1-y1), (x2+y2,x2-y2)的切比雪夫距离。这道题要求不同宗族的最大曼哈顿距离,我们转化为切比雪夫距离来求,我们用线段树维护每个坐标的最大的(xi+...原创 2019-10-04 20:53:08 · 237 阅读 · 0 评论 -
数据结构--线段树
[题目链接] (https://codeforc.es/contest/498/problem/D)普通线段树题目,维护t时刻到达该点的信息。#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 1e5+10;int n;int tr[maxn*4][60];int...原创 2019-09-20 14:40:23 · 96 阅读 · 0 评论