![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线段树
Self-Discipline
在校大学生
展开
-
poj2528 Mayor's posters(线段树的离散化)
题目链接:http://poj.org/problem?id=2528分析:其实离散化就是将一个很大的区间映射为一个很小的区间,而不改变原有的大小覆盖关系。但是注意简单的离散化可能 会出现错误,给出下面两个简单的例子应该能体现普通离散化的缺陷: 例子一:1-10 1-4 5-10 例子二:1-10 1-4 6-10 普通离散化后都变成了[1,4][1,2][3,4] 线段2覆盖了[1,...原创 2018-02-27 16:51:48 · 205 阅读 · 0 评论 -
CH4301 Can youanswer on these queries III (线段树)
题意:给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一:“2 x y”,把 A[x] 改成 y。“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 max(x≤l≤r≤y) { ∑(i=l~r) A[i] }。分析:线段树维护区间最大子段和,本题的关键在于如何维护区间最大子段和。对于线段树的每一个节点,我们定义四域...原创 2019-07-06 22:56:43 · 220 阅读 · 0 评论 -
Codeforces 242E. XOR on Segment (线段树+二进制拆位)
题意:给出一个序列,有两种操作,一种是计算l到r的和,另一种是让l到r的数全部和x做异或运算。分析:异或是一种位运算,如果x的第j位是1,那么说明l到r的每个数的第j位都要反转,(0^1=1,1^1=0),如果是0,那么不变。既然是位运算,那么可不可以将每一位作为线段树单独维护呢?好像可以呢!异或操作的话,相当于是一种区间操作,只需要将l到r的某些位进行反转操作不就行了吗?反转操作什么的,打上l...原创 2019-07-07 14:38:24 · 348 阅读 · 0 评论 -
sdoj2790 市场(线段树区间整除)
题意:分析:区间整除和区间开根号有点像。有人也叫势能线段树,由于每次区间整除之后区间的数都至少要减少到原来的一半,logai次之后区间的数就变为 1了。加上区间加操作,操作的次数也不会多太多。维护一个区间 max、min和sum,当max-max/k=min-min/k时,就相当于区间每个数都减去max-max/k。(最大值整除后作差与最小值整除后作差的差值相同,则可以把差值打标记,即由除变...原创 2019-07-17 11:51:05 · 581 阅读 · 0 评论 -
51nod 2014 小朋友的笑话(势能分析线段树)
题意:小O是一个很萌很萌的女孩子。有一天小O叫了很多很多萌萌哒小朋友到家里来玩。由于太无聊了,她们开始讲笑话。总共有N个小朋友排成一排,编号1~N。在某个时刻,会有编号为xi的小朋友看到了笑话li,然后她会把这个笑话讲出来,与她距离不超过ki的小朋友都会听到这个笑话。当一个小朋友听到一个笑话时,如果她是第一次听得到这个笑话,那么她会觉得这个笑话非常好笑,笑的停不下来。如果她听到之前就...原创 2019-07-17 14:59:41 · 195 阅读 · 0 评论 -
P1438 无聊的数列(线段树+差分)
题意:给一个区间加一个,首项为k,公差为d 的等差序列,求单点值。分析:先建一颗差分线段树,如果我们给某一个区间 l 到 r 加上一个首相为k 公差为d 的等差序列,相当于 给 l 这个点的差分数组 加上 k,l+1 到 r 的这段数组 加上d,r+1 这个点差分数组加上 -(k+(r-l+1-1)*d),然后再利用差分数组的前缀和恰好等于这个点的值 ,利用线段树进行区间求和就好了,这样问题就变...原创 2019-07-19 19:32:18 · 168 阅读 · 0 评论 -
bzoj5312 冒险(势能均摊线段树)
题意:给出序列a,每次有一下三种操作。1,给出l,r,x,将序列l,r之间的所有数都 and x2,给出l,r,x,将序列l,r之间的所有数都 or x3,给出l,r,询问l,r之间的最大值第一行包含两个整数 n,m 接下来一行包含 n 个整数, 表示a序列,接下来 m 行, 每行描述了一个操作.2<=n<=2e5 2<=q<=2e5,0<=a...原创 2019-07-17 16:48:58 · 374 阅读 · 0 评论 -
ZOJ3943 Himalayas(线段树+差分)
题意:有n座山,每座山有个高度,若满足1<i<n&&Hi-1>Hi<Hi+1,那么它就是山谷,每次地震,第L到第R座山高度会发生变化,每座山变化为A+(i-L)*B(1<=i<=n),问每次地震后有几座山谷。分析:相当于区间加一个等差数列,和洛谷P1438差不多,对原数组差分之后,考虑用线段树对差分数组进行维护,区间操作可以变为三段处理,如果...原创 2019-07-19 21:33:56 · 172 阅读 · 0 评论 -
hdu5726 GCD(倍增+二分or线段树+预处理)
题意:给你n个数a1,a2,a3...an(n<=1e5,1<=ai<=1e9),给你q个询问[l,r]。问你gcd(al,al+1,al+2...ar)为多少?再问你有多少个pair(l',r')(1<=l'<=r'<=n)使得gcd(al',al'+1...ar')与gcd(al,al+1,al+2...ar)为多少?分析:方法一:倍增+二分。先rmq...原创 2019-08-03 21:26:03 · 178 阅读 · 0 评论 -
HDU6602 Longest Subarray(线段树+思维)
题意:长度为n的序列,求最大的子序列长度,要求子序列中所出现的数字个数>=k。思路:线段树维护覆盖的区间,参考https://blog.csdn.net/Ratina/article/details/97503663。代码:#include<bits/stdc++.h>using namespace std;#define ll long longconst ...原创 2019-08-04 13:04:58 · 216 阅读 · 0 评论 -
POJ 3171 区间覆盖最小花费(dp+线段树优化)
题意:有一个大区间和n个小区间,每个小区间都有一个代价,求最少付出多少代价可以使得小区间完全覆盖大区间。分析:《算法竞赛进阶指南》P312。代码:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace st...原创 2019-07-22 20:50:54 · 484 阅读 · 0 评论 -
hdu 4630 No Pain No Game(线段树离线处理)
题意:给出n个数,每个数的范围是1~n的。n<=50000;然后查询m次,m<=50000,每次查询[l,r]区间内,任意两个数(不能是同一个数)的gcd的最大值。分析:pre[x]表示因子x从前往后最近出现的位置,考虑位置i时,如果有因子x,则P[x]~i之间即可以有因子x,线段树维护区间最大值。将查询离线,按照右端点排序,一遍扫过去,一边更新,一边求值。也可以从后往前扫。(nt...原创 2019-07-31 22:11:46 · 139 阅读 · 0 评论 -
线段树总结(题目合集)
1、POJ 3321题意:给出一个苹果树,每个节点一开始都有苹果。C X,如果X点有苹果,则拿掉,如果没有,则新长出一个。Q X,查询X点与它的所有后代分支一共有几个苹果。分析:利用dfs序将子树节点变成连续区间,然后利用线段树进行单点修改、区间求和就好了。注意vector<int> g[N]会超时,改成vector<vector<int> > g就好了...原创 2019-08-19 10:19:07 · 1269 阅读 · 0 评论 -
CH 4302 Intervavl(线段树维护区间gcd,区间加)
题意:给定一个长度为 N 的序列,M 个操作,支持区间加,区间查询最大公约数。分析:若是单点修改,区间最大公约数,则可以发现,每次修改最多改变 O(logn) 个答案,且 gcd 可以合并,因此可以直接在线段树上维护。但是对于区间加来说,无法在已知区间加了某一个数时快速计算出新的区间最大公约数,因此,最坏情况下复杂度可能退化到 O(n)。考虑辗转相除法的性质,gcd(x,y,z)=gcd(x,...原创 2019-07-06 22:37:41 · 465 阅读 · 0 评论 -
UVA11992 Fast Matrix Operations 快速矩阵操作(线段树)
题意:对矩阵有三种操作,第一是让矩阵的每个元素加上某个数,第二是让矩阵得每个元素变成某个数,第三是输出某个子矩阵的数字总和,最大值和最小值。开始时,矩阵得每个元素为0.分析:每行建一颗线段树,多维护几个信息。详见《训练指南》P207-208。代码:#include<bits/stdc++.h>using namespace std;const int maxnode...原创 2019-07-09 10:33:44 · 182 阅读 · 0 评论 -
2018 icpc徐州站网络赛 H Ryuji doesn't want to study
题目:点击打开链接题意:给定一个数列,1操作求一个这样的区间[ L , R ]和:a[ R ]+a[ R-1 ]*2+a[ R-2 ]*3+...+a[ L ]*( R - L +1 ),2操作修改一个a[ i ]的值。分析:借助两颗线段树,线段树s1维护正常区间和,线段树s2维护数列:a[ n ],a[ n-1 ]*2,a[ n-2 ]*3,,,,a[ 1 ]*n 的区间和,假如题目求...原创 2018-09-13 19:12:20 · 195 阅读 · 0 评论 -
2018年湖南省省赛 H题-千万不要用树套树
题目:点击打开链接题意:略。分析:用总线段条数减去左端点大于l和右端点小于r的线段数(这两种情况不会有重合),线段树单点更新,区间求和。代码:#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma GCC optimize(4)#pragma comment(linker, "/STACK:102400000,102400...原创 2018-09-14 13:47:34 · 1017 阅读 · 9 评论 -
HDU 6230
题意:字符串S【1,3n-2】 中以 位置n(C1)和2n-1(C2)为回文串中心,长度都为n,找出给出的主串中有多少这样的子串分析:首先用manacher求出以每个点为中心的回文串半径,考虑每个点作为C1时,有多少位置作为C2可以组成字符串S.那么对于答案,实际就是统计满足下列条件(i,j)的对数i <= jj - i <= len[i]j - i <= le...原创 2019-05-22 11:08:31 · 589 阅读 · 0 评论 -
hdu 6430 TeaTree 线段树合并
题意:一棵树上每个节点权值为v[i],每个节点的heard值是:以它为LCA的两个节点的GCD的最大值,要求输出每个节点的heard值分析:线段树合并,对每个节点建一棵线段树,第x个位置就表示v[i]有值为x的因子,只要2个节点有相同的因子就维护答案,每次都把所有子节点的线段树与父节点合并。写法是建立n个线段树,每个线段树保存的是该点权值的所有因数,线段树区间[l,r]表示区间l-r范围内最大...原创 2019-05-30 16:35:20 · 123 阅读 · 0 评论 -
Educational Codeforces Round 62 F. Extending Set of Points 线段树分治+可撤销并查集
题意:有q次操作,每次操作 (x ,y),如果S集合有(x ,y),就删除这对数,如果没有就插入这对数,然后询问S集合在R规则下一共有多少对数(R规则:如果R集合中有(x1,y1) (x1,y2)(x2,y1),且没有(x2,y2),那么在计数的时候会加上(x2,y2)这对)。思路:我们仔细分析这个点加入的条件,很容易可以发现,对于一个点(x,y),相当于把第x行和第y列给合并。最后的答案...原创 2019-05-31 00:29:34 · 161 阅读 · 0 评论 -
codeforces 1044F DFS dfs序+线段树
题意:给一颗初始树,然后有q次操作,每次操作一对点,如果这对点有边,就删除边(保证不删除初始的树边),否则,就加一条边,接下来你可以从某个点dfs搜索,如果搜索出来的边和初始树的边一样,那这个点就是好的点,求每次操作后有多少个好的点。思路:首先对初始的树走一遍dfs序,l[u]表示u这个节点的dfs序号,r[u]表示以u为根的子树的序号最大的那个点序号,接下来看图分析。假设加入x ...原创 2019-06-01 00:54:31 · 304 阅读 · 0 评论 -
LA 4730 Kingdom 线段树+并查集
题意:有T组測试数据。每组数据的N表示有N个城市,接下来的N行里每行给出每一个城市的坐标(0<=x,y<=1000000),然后有M(1<M<200000)个操作,操作有两类,(1)"road A B",表示将城市A和城市B通过一条道路连接,假设A和B原来属于不同的城市群。经过这个操作。A和B就在一个城市群里了。保证每条道路不会和其它道路相交(除了端点A和B)。(2)"li...原创 2019-06-01 10:01:38 · 179 阅读 · 0 评论 -
SPOJ GSS4 Can you answer these queries IV
题意:给定的n个数,我们定义两个操作,分别是区间开根号以及区间求和。共有m次查询,其中n,m≤1e5。思路:一个1e18以内的数,经过最多6次开平方操作后,会变成1。建立线段树,对于每一个叶子节点我们最多进行6次的更新操作后,每次就不会改变大小了。那么我们可以通过维护区间和,如果区间和等于区间长度则不需要更新(或者区间的最大值和区间和,对于区间最大值是1的区间,我们就可以直接不考虑了)因为对其中...原创 2019-06-06 14:26:08 · 189 阅读 · 0 评论 -
HDU 6315 Naive Operations
题意:给出一个长度为n初值为0的数组,以及长度为n的b数组,然后q次操作,add(l,r) 使得区间l~r所有元素+1,或者查询l~r区间a[i]/b[i]的和。题解:线段树+思维好题,这题构造线段树的方法很巧妙,竟然是以b数组构造,线段树维护的是区间最小值,每次区间加 1变成区间减1,每次更新时,直接将 b 数组的对应区间都减一,如果发现有零,就将对应位置的答案加一并重置回原b数组对应的数,...原创 2019-06-06 15:55:28 · 125 阅读 · 0 评论 -
CSU 2167
题意:初始有n*m的点,矩形排列。有2种操作,第一种是将第i行的所有点联通(a<=i<=b),第二种是将第i列的所有点联通(a<=i<=b)。每次操作后输出有多少个联通块。分析:在纸上画一下图,可以发现答案跟a,b所跨水平和垂直区间有关,如图,假设nn为水平方向所占用的区间,mm为垂直方向所占的区间,且共有n行m列,则它是把mm×m+nn×n-nn×mm个点连通成一个点...原创 2019-05-29 13:46:13 · 351 阅读 · 0 评论 -
HDU1698 Just a Hook (线段树lazy标记的运用)
题意:t组数据,给一个n,m表示n长度的钩和m次操作,初始钩子的每单位长度的价值为1,接下来输入 x,y,k 的操作把钩子[x,y]区间的价值替换为k,求m次操作后钩子的价值为多少分析:成段替换,最后只要求第一个区间就可以了,不用写query询问。代码:#include<bits/stdc++.h>using namespace std;const int maxn ...原创 2019-07-07 23:38:30 · 108 阅读 · 0 评论 -
UVALive 3938 "Ray, Pass me the dishes!" 动态最大连续和(线段树)
题意:给出一个长度为n的序列, 再给出m个询问, 每个询问是在序列[a,b][a,b]之间的最大连续和. 要你计算出这个这个区间内最大连续和的区间[x,y](a≤x≤y≤b)[x,y](a≤x≤y≤b)。分析:详见《训练指南》P201-202。代码:#include<bits/stdc++.h>using namespace std;const int max...原创 2019-07-09 10:18:12 · 129 阅读 · 0 评论 -
CodeForces 482B. Interesting Array(线段树)
题意:构造出一个序列,满足下面m个要求:每一个要求的组成是l,r,q三个数,表示从a[l]&a[l+1]....&a[r]的值为q,问能不能构造出这样的序列。分析:刚开始还想着建对每一位建立线段树,后面发现直接用异或运算维护一颗线段树就好了。s[i]表示该区间的&的值,先满足所有要求,s[i]|q来满足。最后判断每个s[i]的值是否还为原值,若不是,则无法构造。否则叶子...原创 2019-08-15 19:14:26 · 150 阅读 · 0 评论