数据结构-----线段树
柒月 流火
菜
展开
-
线段树 单点修改,区间查询/修改/求和模板
单点修改,区间求和#include<cstdio>const int maxn=50000;int sum[4*maxn]; //求和int node[maxn]; //存原数组下标void pushup(int rt) //更新节点信息 这里是求和{ sum[rt]=sum[rt<<1]+sum[rt<<1|1];} //...原创 2018-10-16 17:23:28 · 435 阅读 · 0 评论 -
HDU - 5692 Snacks DFS序+线段树
思路求子树x中到根节点的最大值。修改时需要将子树x的所有点都修改。则本题变成一个区间更新,区间最值的题。dfs序处理后,套一个支持区间更新的线段树即可。 每个叶子节点存储的都是0到他所对应的标号(第几台零食机)的距离,每一次pushup时都会找出对应区间的最大值#pragma comment(linker, "/STACK:1024000000,1024000000")#inclu...原创 2018-11-15 20:50:32 · 106 阅读 · 0 评论 -
HDU - 1542 Atlantis 面积并
HDU - 1542 Atlantis 第一次做扫描线,感觉很懵逼,思路很好理解,但代码实现完全想不到。。。不会的可以看这:算法总结:【线段树+扫描线】&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828)用1标记下边,-1标记上边是最合理的(想想为什么,提示:下边--插入,上边--删除)这题横坐标略大,需要离散化处理 现在假设有两个区间段:1——2——3...原创 2018-11-21 22:22:02 · 162 阅读 · 0 评论 -
HDU - 4578 Transformation 线段树 思维
题目链接: HDU - 4578 Transformation 题意:给你一个数组,初始值为零,有四种操作(1)"1 x y c",代表 把区间 [x,y] 上的值全部加c(2)"2 x y c",代表 把区间 [x,y] 上的值全部乘以c(3)"3 x y c" 代表 把区间 [x,y]上的值全部赋值为c(4)"4 x y p" 代表 输出区间 [x,y] 上值的p次方和1&...原创 2018-11-18 15:56:51 · 169 阅读 · 0 评论 -
POJ - 1177 Picture 扫描线求周长
POJ - 1177 Picture详解:算法总结:【线段树+扫描线】&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828)参考了大佬的思路#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#define ls rt<&...原创 2018-12-04 22:19:57 · 350 阅读 · 0 评论 -
HDU - 1255 覆盖的面积 面积交
HDU - 1255 覆盖的面积 这道题在区间并的基础上稍微修改了一下,多了一个记录覆盖两次或两次以上的长度变量 ss 和 判断条件详细讲解 Titanium#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define ls rt&l...原创 2018-11-27 21:58:34 · 167 阅读 · 0 评论 -
CodeForces-610D 扫描线求面积并
CodeForces-610D题意给定一些平行于坐标轴的线段,线段的宽度为1,单位线段的面积为 1 .求所有线段的面积(并)的和思路只要找出右上角端点,横纵坐标都加 1 存储就行#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#defi...原创 2018-12-01 17:13:46 · 204 阅读 · 0 评论 -
P1047 洛谷 校门外的树 线段树
P1047 洛谷 校门外的树 卡了一小时的模板题 #include<iostream>#include<cstdio>#include<cstring>#define ls rt<<1#define rs rt<<1|1using namespace std;const int maxn=10010;int su...原创 2018-12-01 22:01:24 · 308 阅读 · 0 评论 -
POJ - 3321 Apple Tree DFS序+线段树 / 树状数组
POJ - 3321 Apple Tree题意;一颗苹果树上有n个树杈,每个树杈都长了一个苹果。C X表示 如果第X个树杈有苹果就摘掉,如果没有就会长出一个。Q X表示 输出X和X的子树杈一共有多少个苹果。1.线段树用线段树+vector就会 TLE#include<cstdio>#include<cstring>#include<...原创 2018-12-24 22:25:45 · 181 阅读 · 0 评论 -
Codeforces 920F - SUM and REPLACE 线段树
Codeforces 920F - SUM and REPLACE题意:给定一组长度为n的数组,有m次操作(两种不同的操作)。每次操作输入三个数 t x y,如果 t==1 ,将从 x 到 y 的每一个数都变为D(i) (D(i)为 i 的因子个数),t==2 输出从 x 到 y 的和。思路:线段树。此处需要一点优化。2的因子个数是2,1的因子个数是1,如果需要更新的位置 所存...原创 2019-01-20 15:36:19 · 151 阅读 · 0 评论 -
Spoj GSS3 Can you answer these queries III 线段树求区间最大子段和
题意:给你 n 个数,有两种操作:1,将某一点的值修改;2,给你一段区间,求出区间内最大连续子段和思路:线段树,将每个区间的左端点最大和(lmax)、右端点最大和(rmax)、此区间最大和(dat)、此区间和(sum)保存在结构体中,每次修改时更新即可某一部分的的最大和有三种可能完全是右儿子的最大子段和 完全是左儿子的最大子段和 既有一部分在左儿子中,又有一部分在右儿...原创 2019-03-30 15:38:51 · 176 阅读 · 0 评论 -
POJ 3667 Hotel 线段树区间合并+延迟标记
HotelTime Limit:3000MS Memory Limit:65536K Total Submissions:21646 Accepted:9427 Descript...原创 2019-04-01 19:36:38 · 135 阅读 · 0 评论 -
CodeForces - 339D Xenia and Bit Operations
CodeForces - 339D Xenia and Bit Operations 题意:给定n和m,给你一个包含2^n个数的数组,有m次操作,每次操作先将p位置的数修改,先两两相或使数组减少一半,再两两相异或使数组再减少一半,一直重复这两种操作,直到数组剩余一个元素。m行操作p v (假设原数组为a)将a[p]的值改为v第一次计算 b1 = a[1] | a[2] ,...原创 2019-04-14 22:09:24 · 250 阅读 · 0 评论 -
HDU - 4630 No Pain No Game 线段树离线操作 求区间内任意两个数的最大公约数
HDU - 4630 No Pain No Game 题意:有n个数,m个区间询问,每次输出区间内任意两个数的最大公约数。思路:线段树离线+点更新+区间查询我们维护一颗线段树,线段树维护的值是区间内最大的gcd。首先我们预处理所有数字的因子,然后我们将排序过后的区间(按照右端点从小到大排序)从左到右依次处理(为了加强理解,设定k<i<j),每扫描一个值a[i],我...原创 2019-04-26 21:37:15 · 427 阅读 · 0 评论 -
Can you answer these queries? HDU - 4027 区间修改&&(优化)
Can you answer these queries?Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 25840 Accepted Submission(s): 6147Problem DescriptionA lot of battleships of evil are arranged in a line before th原创 2018-11-08 20:24:50 · 110 阅读 · 0 评论 -
Counting Offspring HDU - 3887 简单DFS序+线段树
Counting Offspring HDU - 3887 DFS序讲解DFS序后图题意求每一个点子树中标号比他小的节点数思路用DFS求出每一个点的 in,out ,x点的所有子节点就在in[x]到out[x]之间。建树时以每个点 in[ ]的值对应叶子结点(例如:in[3]=4,则树4~4区间所对应的叶子结点所表示标号的即为3)。查询时因为范围已经确定所以只需按照输出顺序...原创 2018-11-12 21:26:58 · 207 阅读 · 0 评论 -
敌兵布阵 HDU - 1166
线段树#include<cstdio>const int maxn=50000;int sum[4*maxn]; //求和int node[maxn]; //存原数组下标void pushup(int rt) //更新节点信息 这里是求和{ sum[rt]=sum[rt<<1]+sum[rt<<1|1];} // build...原创 2018-10-16 21:23:57 · 155 阅读 · 0 评论 -
I Hate It HDU - 1754 (单点更新,区间最值)
多组输入。。。一开始眼瞎了没看见#include<cstdio>#include<algorithm>using namespace std;const int maxn=524288; //这应该是最小区间数int sum[maxn]; //存最值int node[maxn/2];void pushup(int rt) //求结点最值{ ...原创 2018-10-16 22:19:02 · 146 阅读 · 0 评论 -
Lost Cows POJ - 2182 线段树 点修改 逆序
题意有n头牛,每头牛都有一个编号。从排在第二只牛开始,给出这头牛的左边有几只编号比他小的牛。求每一个位置上牛的编号。题意半天才看懂。。思路最后一只牛的编号是可以确定的。如果左边有k头编号比他小的牛,他的编号必为k+1。当最后一头牛的编号确定以后,倒数第二头牛的编号也能确定。所以我们可以倒着访问。用sum记录所在空间剩余的位置。对于插入在 val 位置的牛他前边一定要有 val ...原创 2018-10-22 16:49:10 · 122 阅读 · 0 评论 -
Billboard HDU - 2795 线段树点修改,求区间最大
题意给你一个广告牌的长度和宽度,和要贴的广告数。每条广告的长度为 1 ,输入n条广告的高。输出广告所在的行数。所有的广告都靠左贴。思路以行数h来建树,每一个叶子结点代表一行,以数组node存放剩余宽度,初始化为广告牌的宽度。减去每次用掉的宽度,更新剩余宽度的最大值。#include<cstdio>#include<algorithm>using nam...原创 2018-10-20 09:59:24 · 202 阅读 · 0 评论 -
An easy problem HDU - 5475 线段树 点修改
题意计算器初始值为1,只能进行 乘,除操作。当x=1时,乘以y当x=2时,除以第 y 次操作(第y次操作肯定是乘,x=1)所乘的数。输出的结果是对M取余后的结果思路建树时,将每一个节点初始化为1。假如第 J次操作,x=1 就将 [J,J]区间所在叶子结点的 sum[ ] 更新为y,x=2就将[y,y]区间所在的sum[ ]值更新为1。 为什么更新为 1 ?当x=2时,y的值...原创 2018-10-20 20:05:19 · 122 阅读 · 0 评论 -
Multiply game HDU - 3074 点修改,区间求积
当k=0,求x~y积;k=1,点修改一开始以为sum求余以后就不用在区间求积那里取余了,wr了一次 ( ̄▽ ̄)"#include<cstdio>#include<cstring>#define mod 1000000007typedef long long ll;const int maxn=50000;ll sum[maxn<<2];...原创 2018-10-20 22:29:43 · 155 阅读 · 0 评论 -
Buy Tickets POJ - 2828 线段树 点修改
题意有N个人排名买票,现在给出每个人要插入的位置pos(0<=pos<=N-1)以及他的价值val。在插入N个人后,会构成一个新序列。现在让你按顺序 输出新序列中每个位置pos对应的价值val思路最后一次插入某个位置的人,他的位置不会再改变,所以我们应该从后往前插入。用sum记录所在空间剩余的位置。对于插入在pos位置的人他前边一定要有pos-1(1~n 建树)个剩余位置。...原创 2018-10-21 17:44:53 · 170 阅读 · 0 评论 -
Count the Colors ZOJ - 1610 线段树 段更新
题意给n段区间染色(不是n个点),每次给的都是每段区间的(首,尾)两点坐标。输出每种颜色有多少段不连续的区间思路一开始卡在了如何计算最后每种颜色有多少段不相邻的区间上。。。将染色的区间都压缩到根节点,查询时将所有的颜色存到vis[ ]中,将vis数组遍历一遍,每找到一段 x 颜色的区间就sum[x]++。线段树一般存的都是点,如何存储段呢?每次更新时将左端点加一就能将单位区间当...原创 2018-11-06 20:50:20 · 163 阅读 · 0 评论 -
A Simple Problem with Integers POJ - 3468 线段树 区间修改 求和
用到标记数组#include<cstdio>#include<cstring>typedef long long ll;const int maxn=262144;int node[maxn/2]; //原数组ll sum[maxn]; //求和数组int add[maxn]; //标记数组void pushup(int rt){ ...原创 2018-11-04 09:37:17 · 204 阅读 · 0 评论 -
Mayor's posters POJ - 2528 线段树&&离散化
Mayor's posters POJ - 2528 题意 : 在墙上贴海报, n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000)。求出最后还能看见多少张海报。分析 : 很容易想到利用线段树来成段置换,最后统计总区间不同数的个数。但是这里有一个问题,就是区间可以很大,线段树开不了那么大的空间,遂想能不能离...原创 2018-11-04 21:22:20 · 155 阅读 · 0 评论 -
Just a Hook HDU - 1698 区间修改/求和
Just a Hook HDU - 1698 一开始都是铜钩子所以价值都为1 ,然后修改钩子的价值,最后输出总结果就行#include<cstdio>#include<cstring>using namespace std;const int maxn=262144;int sum[maxn];int add[maxn]; //标记数组void pu...原创 2018-11-05 16:03:49 · 111 阅读 · 0 评论 -
Balanced Lineup POJ - 3264 RMQ 裸题 线段树
RMQ#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int maxn=50010;int maxsum[maxn][20],minsum[maxn][20];void rmq(int n) //预处理{ for(int j=1...原创 2018-10-28 15:35:07 · 132 阅读 · 0 评论 -
Assign the task HDU - 3974 DFS序+线段树区间更新/查询
Assign the task HDU - 3974 题意一个公司有n个人,有一个人是领导(等级最高)没有上司,其余每个人都有一个上司。给定m个要求,当输入为“C x”时,输出x当前的任务;当输入为"T x y"时,给x分配一个任务y(此时,x和x的下属都需要放弃原来的任务,执行当前的任务y)。思路dfs序+区间更新#include<cstdio>#incl...原创 2018-11-13 16:02:41 · 182 阅读 · 0 评论 -
ZOJ - 3606 Lazy Salesgirl 线段树+思维
ZOJ - 3606 Lazy Salesgirl 题意:有n个人去面包店买面包,第 i 个人在 ti 分钟去买价格为 qi 的面包,他会买 1+(i-1)%3 块面包。如果在连续的 w 分钟内没有人去买面包 店主就会睡觉,直到下一个人去把店主叫醒,但这个人会什么也不买就离开蛋糕店。求在最大平均售价的情况下最小的 w ,输出 w 和 最大平均售价( 销售额 / 人数 )。题解:...原创 2019-05-03 22:12:12 · 148 阅读 · 0 评论