![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM-数据结构-线段树
暗金色
这个作者很懒,什么都没留下…
展开
-
HDU - 3974 Assign the task(线段树 区间修改)
题目大意:给你一棵树,刚开始每个节点都是-1,有两种操作 C x:查询x这个结点 T x c:将x和x的所有子孙结点都变成c解题思路:dfs一下,找出每个点所管辖的区域(x和其所有子孙结点),这样就可以将点映射到区间了#include <cstdio>#include <cstring>const int N = 50010;const int M = 50010 << 2;struct原创 2015-10-21 10:21:29 · 557 阅读 · 1 评论 -
HDU - 4553 约会安排(线段树 区间合并)
题目大意:中文题意解题思路:设计三个mark,一个是女神的,一个是学习的,一个是基友的,其中优先级是学习<基友<女神,更新的时候按照优先级更新 区间维护六个数,一个是左连续的最长空闲时间,一个是右连续的最长空闲时间,一个是最长空闲时间,三个时间,一个是基友的,一个是女神的,所以共6个 询问的时候,如果是基友的话,直接判断总的基友的连续时间,如果时间够的话,就找出,输出并更新。反之,则另外输出原创 2015-10-21 23:18:29 · 907 阅读 · 0 评论 -
UVALive - 3938 "Ray, Pass me the dishes!" 线段树
题目大意:给你一个N个数字的序列和M个问题,问题的内容是给出一个区间[x,y],然后求出这个区间的满足x 解题思路:这题的线段树比较复杂,以前的线段树只维护一个值而已,现在的线段树维护的是三个值,前缀和pre,连续和sub,后缀和suf,要求区间[x,y]的满足条件的a,b无非有三种情况,假设现在的区间时的[l,r],他的两个子区间分别为,左子区间[l,mid],右子区间[mid+1,r]原创 2015-01-02 15:56:05 · 757 阅读 · 0 评论 -
UVA - 11992 Fast Matrix Operations 线段树(区间修改)
题目大意:给出一个矩阵,三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v2 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部变成v3 x1 y1 x2 y2:输出x1 <= row <= x2, y1 <= col <= y2的点的和,最小值和最大值进行输出解题思原创 2015-03-27 20:55:16 · 599 阅读 · 0 评论 -
UVALive - 2191 Potentiometers 线段树点修改
题目大意:有两种操作 S x y:把第x个树改成y M x y: 计算第x个数到第y个数之和#include<cstdio>#include<cstring>#define maxn 8000000int sum[maxn];void build(int u, int l, int r) { if(l == r) { scanf("%d", &sum[u]);原创 2015-04-03 21:32:10 · 552 阅读 · 0 评论 -
UVA - 12299 RMQ with Shifts 线段树(点修改)
题目大意:给出一系列操作 shift操作:要求将里面所给的位置的数向左循环移动 query操作:求出区间里面的最小值解题思路:线段树的模版题,shift操作比较麻烦而已,一个一个的移动就可以了#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100000 <<原创 2015-04-06 19:45:40 · 601 阅读 · 0 评论 -
线段树(单点修改)
1. HDU-1166 敌兵布阵解题思路:版模题#include#includeusing namespace std;const int maxn = 50000 << 2;int num[maxn], S[maxn], L[maxn], R[maxn];void build(int u, int l ,int r) { if(l == r) { S[u] = n原创 2015-01-01 16:12:56 · 648 阅读 · 0 评论 -
UVALive - 4108 SKYLINE 线段树(区间修改)
题目大意:有n件物体,每件物体都有相应的l,r,h l代表该物体的最左端 r代表物体的最右端 h代表该物体的高度 现在要求这些物体的覆盖区间和,覆盖表示在后面这些物体还没到来时,当前这个物体在(l,r)的区间内高度是h的的占多少解题思路:维护两个值max和min,模版题#include<cstdio>#include<cstring>#include<algorithm>using n原创 2015-04-07 19:37:36 · 646 阅读 · 0 评论 -
POJ - 2406 Power Strings(KMP 循环节)
题目大意:问一个字符串由多少个循环节构成解题思路:循环节和next的关系#include <cstdio>#include <cstring>const int N = 1000010;char str[N];int len;int next[N];void getFail() { len = strlen(str); int i = 0, j = -1; next原创 2015-10-26 22:47:13 · 337 阅读 · 0 评论 -
HDU - 1754 I Hate It(线段树,单点修改)
题目大意:中文题解题思路:模版题#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 200000 << 2;int S[maxn], L[maxn], R[maxn];int num[maxn];void build(int u, int l, int r) {原创 2015-10-13 23:18:59 · 356 阅读 · 0 评论 -
ZOJ - 1610 Count the Colors(线段树)
题目大意:给你N个操作,操作如下 l r c,将[l,r]涂成c这种颜色 问最后有颜色的占的长度是多大解题思路:线段树的区间修改,最后再询问一下就可以了 但这题有个坑点,就是他要求染的是一个区间 假设给出如下数据 1 4 1 1 2 2 3 4 3 如果直接套用他所给的数的话,得到的答案是只有两种颜色的,但实际上有三种颜色,[2,3]是颜色1的,所以在Modify的时候要特殊处理一原创 2015-10-20 23:30:06 · 472 阅读 · 0 评论 -
HDU - 1542 Atlantis(线段树 扫描线)
题目大意:给你N个矩形,问这N个矩形的轮廓面积解题思路:线段树 扫描线的裸题了,具体可以百度一下,这边就没有那么多的图文解说了。。。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 110 << 3;struct segment{ double l, r,原创 2015-10-21 13:10:08 · 380 阅读 · 0 评论 -
HDU - 4578 Transformation(线段树 区间修改)
题目大意:给出N个数,初始化都是0,4种操作 1 x y c:区间[x,y]的所有数加上c 2 x y c:区间[x,y]的所有数乘上c 3 x y c:区间[x,y]的所有数变成c 4 x y c:求区间[x,y]的所有数的c次方和解题思路:维护区间的4个数,val表示区间内相同的数,add表示区间内的所有数加上了多少,mul表示区间内的所有数乘上了多少,same表示区间内的所有数是否都相原创 2015-10-21 10:39:49 · 461 阅读 · 0 评论 -
POJ - 1177 Picture(线段树 扫描线 区间合并)
题目大意:给你N个矩形,要求你求出这N个矩形的轮廓线周长解题思路:先离散化坐标,接着进行扫描线,我是离散x坐标的 先讨论一下,和x轴平行的轮廓线的周长,这里分两种情况的线 1.添加一条下线,如果总长度有增加的话,那么多出来的长度是属于轮廓线的一部分的,如果总长度没有增加,表示这条线被包含在内了,不属于轮廓线 2.添加一条上线,如果总长度有减少的话,那么减少的部分是属于轮廓线的,如果没有减少,表原创 2015-10-21 11:05:37 · 544 阅读 · 0 评论 -
HDU - 1255 覆盖的面积(线段树 扫描线)
题目大意:中文题解题思路:记录区间被cover的次数,区间的被cover1次的长度len,区间被cover2次或者2次以上的长度twice 所要求的覆盖面积,就是求被cover两次或者两次以上的长度 * 高的和首先判断是否被cover过,先更新一下len 1.接着判断一下是否被cover过次或者两次以上,如果符合,直接等于右端点-左端点 2.如果不符合条件1,且l == r ,那么twice原创 2015-10-21 11:13:01 · 510 阅读 · 0 评论 -
POJ - 2528 Mayor's posters(线段树+离散化)
题目大意:有N张海报,现在按顺序将这些海报贴在墙上,每张海报占的[l,r],问最后墙上能看到几张海报解题思路:线段树的区间修改,但是这题数据有点大,所以要离散化下 接着就是进行区间修改了,但是这题有个坑点,如果直接离散话的化,有可能会错的 假设有三组数据,[1,10], [1,4] [6,10] 离散化后,1是1,4是2,6是3,10是4 贴第一张海报时:墙的1~4被染为1; 第二张海报时原创 2015-10-20 23:10:00 · 407 阅读 · 0 评论 -
POJ - 3264 Balanced Lineup(线段树)
题目大意:给你N个数,然后询问,询问的是区间内最大值和最小值的差解题思路:线段树的裸题了,维护最大值和最小值即可#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;const int N = 50010 << 2;int n, q;int原创 2015-10-20 23:33:03 · 391 阅读 · 0 评论 -
HDU - 1540 Tunnel Warfare(线段树 区间合并)
题目大意:给你N个点,相邻的点连线。现在有3种操作 D x:破坏和x相连的线 Q x:x和几个点相连 R:修复刚被破坏的点的连接解题思路:刚破坏的点可以用一个栈来存储。现在的问题是,怎么求一个点和几个点相连 我们维护区间的三个值,从最左端往右的连续没有被破坏的点数量lsum,从最右端开始往左的连续的没有被破坏的点的数量rsum,区间内最长的连续的没有被破坏的点的数量tsum询问的时候可以这样原创 2015-10-21 10:17:24 · 361 阅读 · 0 评论 -
HDU - 4027 Can you answer these queries?(线段树)
题目大意:给你N个数,两种操作 0 l r:[l,r]内的所有数开根 1 l r:[l,r]内的数字的和解题思路:不断开根的话,最多只需要6次,6次以上的,都是1了,所以维护的是当前区间被开了几次根的和 这个可以先预处理下,先预处理所有所有情况的开根和(不超过7次),然后在用一个标记,标记该区间被开了几次根,求和的时候就可以依据此标记来找和了#include <cstdio>#include原创 2015-10-21 09:52:52 · 416 阅读 · 0 评论 -
HDU - 4614 Vases and Flowers(线段树 区间修改 二分)
题目大意:有N个花瓶,刚开始每个花瓶都是空的,每个花瓶只能放一束花,现在有两种操作 1 x y:收到了y束花,要求从花瓶x开始放过去,如果花瓶不够,多的花直接丢弃,输出放的花瓶的起始和终点,如果一个花瓶也没有,另外输出 2 x y:[x,y]内的花瓶清空,输出清空了几个花瓶解题思路:维护区间的空的花瓶的数量,第二个操作就比较简单了,现在讨论第一个操作 首先判断一下,区间是否有花瓶(特殊情况),原创 2015-10-21 10:46:15 · 888 阅读 · 0 评论 -
POJ - 3468 A Simple Problem with Integers(线段树)
题目大意:中文题解题思路:线段树区间修改裸题#include <cstdio>#include <cstring>using namespace std;typedef long long LL;const int N = 100010 << 2;LL setv[N], val[N], sum[N];int n, q;void PushUp(int u) { sum[u] = su原创 2015-10-20 22:51:59 · 374 阅读 · 0 评论 -
HDU - 1698 Just a Hook(线段树)
题目大意:给你一个区间,N个操作,操作如下: l r c,将区间[l,r]的所有数变成c,问最后区间的和解题思路:线段树的区间修改,维护和#include <cstdio>#include <cstring>const int N = 100010 << 2;int val[N], sum[N], setv[N];int n;void build(int u, int l, int r)原创 2015-10-20 23:13:06 · 383 阅读 · 0 评论 -
HDU - 1166 敌兵布阵(线段树,单点修改)
题目大意:中文题意解题思路:模版题#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 50010 << 2;int val[N], sum[N];int n;void build(int u, int l, int r) { if (l == r) {原创 2015-10-13 23:17:17 · 314 阅读 · 0 评论