![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
线段树
线段树的运用
kuricip
如果你瞄准月亮,即便迷失,也是在星辰之间
展开
-
Transformation(三重标记线段树)
题目传送门Transformation题目大意含n个数字的的数列a各数字初值均为0,对其进行m次操作,每次操作可为下列之一:1 x y c1\ x\ y\ c1 x y c:axa_xax到aya_yay间的数字(含边界)均增加c2 x y c2\ x\ y\ c2 x y c:axa_xax到aya_yay间的数字(含边界)均乘以c3 x y&nb原创 2020-10-12 23:16:57 · 120 阅读 · 0 评论 -
Assign the task(dfs序+线段树)
题目传送门Assign the task题目大意给你一棵树,共n个结点,每个结点具有一个颜色,可以对结点进行染色和查询共n-1条边,分N-1行分别包含两个整数u和v,表示v是u的父节点然后有m次操作若为染色操作则输入“T x k”若为查询操作则输入“C x”思路首先可以用dfs序将无根树区间化,即可以求出每个节点的管辖区间然后就是区间修改,单点查询即可,维护每个点的值即可AC Code#include<bits/stdc++.h>using namespace std;原创 2020-10-11 22:41:00 · 259 阅读 · 0 评论 -
Tunnel Warfare(线段树)
题目传送门Tunnel Warfare题目大意给你一个长度为n的区间,最开始所有的点都是连通的,当点被毁灭时即为从该点断开m次操作,操作分为D a 毁掉a点Q a 查询a点所在区间的连续段R 修复刚毁掉的点思路线段树,单点修改,区间查询维护每个所在区间的最大值和最小值即可例如样例中,最开始为1 2 3 4 5 6 7,每个点的最小值均为0,最大值为n+1=8;当D 3,毁掉3后,变为1 2 4 5 6 7,前两个点最小值为0,最大值为3,区间长度为3-0-1=2,后四个点最原创 2020-10-10 13:16:33 · 487 阅读 · 0 评论 -
Can you answer these queries?(线段树)
题目传送门Can you answer these queries?题目大意给你一个长度为n的序列,和序列中每个元素的值,和m次操作分别给出op,x,y如果op=0则更新区间x~y,更新操作为对每个值取平方根向下取整op==1则查询区间x~y的元素和思路显然线段树(毕竟我是练习线段树才找的这个题),区间更新,区间查询,维护区间和注意点比较多:元素的范围是long long每组数据后换行区间均为1时特判一下,不进行后续更新区间x不一定小于y,记得处理一下AC Code#inclu原创 2020-10-08 22:46:42 · 124 阅读 · 0 评论 -
Balanced Lineup(线段树)
题目传送门Balanced Lineup题目大意一片绿地的N(1≤N≤50000)颗树排成一排,q次查询,每次查询区间最大值和最小值之差思路很ez的线段树了,更新和push_down都不需要,lazy标记也无直接线段树维护区间最大值和最小值即可AC Code#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>using namespace std;原创 2020-10-08 11:12:48 · 240 阅读 · 0 评论 -
Count the Colors(线段树,区间修改,单点查询)
题目传送门Count the Colors题目大意一面长为8000的墙,给出n次操作,每次给出x,y,z,代表在x~y区间将墙粉刷成颜色z,后面的粉刷可以覆盖之前的求最后墙上不同的颜色的种数和每种颜色非连续的段数思路很明显的区间修改,单点查询注意点:多组输入最后换行,不然会PE显然区间是左开右闭的编号从0开始代表颜色可以为0AC Code#include<bits/stdc++.h>using namespace std;#define debug(a) cout&原创 2020-10-08 00:26:04 · 213 阅读 · 0 评论 -
Just a Hook(线段树,成段更新)
#include<bits/stdc++.h>using namespace std;const int N=1e5 +9;int T, n, m, x, y ,z;struct segtree{ int sum, tag, c;}tr[N<<2];inline int read(){ int ans=0; char last=' ',ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=ge原创 2020-10-07 18:04:35 · 82 阅读 · 0 评论 -
Mayor‘s posters(离散化+线段树)
题目传送门Mayor’s posters题目大意n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000)l_i,r_i(1<=l_i<=r_i<=10000000)li,ri(1<=li<=ri<=10000000) 。求出最后还能看见多少张海报。(海边只露出部分也算)思路首先注意到数据范围li,ri(1<=li<=ri<=10000000)l_i,r_i原创 2020-10-07 00:58:22 · 148 阅读 · 0 评论 -
P1886 滑动窗口 /【模板】单调队列(线段树做法)
题目传送门滑动窗口题目大意有一个长为 n 的序列 a,以及一个大小为 k 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。思路本来是单调队列的题,因为练习线段树,所以用线段树写了一遍。维护区间最大值和最小值即可,注意一下序列a的数据范围就行AC Code#include<bits/stdc++.h>using namespace std;#define INF 0x7fffffff#define int long longcon原创 2020-10-06 10:55:54 · 92 阅读 · 0 评论 -
P1531 && HDU - 1754 I Hate It(线段树)
题目传送门I Hate It题目大意n个学生,告知你每位学生的成绩,m次查询,每一行有一个字符 C (只取’Q’或’U’) ,和两个正整数A,B。当C为’Q’的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。当C为’U’的时候,表示这是一条更新操作,如果当前A学生的成绩低于B,则把ID为A的学生的成绩更改为B,否则不改动。思路很明显的区间查询,单点修改,维护区间最大值即可线段树模板题AC Code#include<bits/stdc++.h&原创 2020-10-06 10:08:06 · 98 阅读 · 0 评论 -
P2003 [CRCI2007-2008] PLATFORME 平板(线段树)
题目传送门平板题目大意一个空间中,给你n个板子,分别告知你每个板子的高度和水平的边缘坐标上面的板子可以搭建在下面的板子上,如下图:求所需的最小的支柱的长度思路因为数据小的原因可以采取O(n2)O(n^2)O(n2)的简单做法,但因为学习线段树中,故给出线段树的解法先以板子的高度进行排序,然后后面的板子必在高处,判断两端下方的位置是否有板子后修改即可即为单点查询,区间修改在处理边界时,发现容易误判,采取大佬的想法:查[l,l+1] 与 [r-1,r]时,这就会使边界相交的板子误判可插钉原创 2020-10-06 00:42:09 · 222 阅读 · 0 评论 -
P1904 天际线(线段树)
题目传送门天际线题目大意在二维坐标系的第一象限中,x轴上有多个城市,分别给你每个高楼的起始点,高度和终止点,高楼可以重叠,求高楼的总轮廓,输出为每个折点的(x,y)思路做法:扫描线+线段树做线段区间覆盖数据范围不大,所以可以不离散化直接线段树维护区间最大值即可AC Code#include<bits/stdc++.h>using namespace std;const int N=1e4+7;int t[N<<2],tag[N<<2];inlin原创 2020-10-05 21:22:01 · 363 阅读 · 0 评论