
ACM-线段树
路小白_zZ
这个作者很懒,什么都没留下…
展开
-
hdu 4027(区间更新)
题意:有n个数字,q次询问,两种操作0 x y 把区间[x,y]全部开根号,1 x y 询问区间[x,y]数字和。 题解:q的范围到100000,题目中说数字最大2^63,所以一个数字最多开7次根就是1不再变化了,所以用一个线段树维护每个数字还能开多少次根号,区间维护最大值,如果某个区间的最大次数已经是0,就不用更新了。一直wa,然后发现有可能x > y,吐血。。。#include <cstdio原创 2015-10-30 20:30:52 · 464 阅读 · 0 评论 -
hdu 3642(扫描线)
题意:有n个立方体,给出每个立方体的左下角坐标和右上角坐标,问至少三个立方体相交的体积和。 题解:刚做了一个平面的,其实原理一样,都是用线段树维护区间内不覆盖、覆盖一次、覆盖两次、覆盖三次的长度,然后区间合并仔细写就行了,因为z轴的取整范围最多到500,可以直接把所有z坐标保存排序然后枚举每小段z轴,把所有包含这段的立方体用扫描线处理,转化为平面问题,每次的计算的面积结果乘这小段z轴长度就是体积。原创 2015-09-07 01:39:44 · 696 阅读 · 0 评论 -
hdu 1255(离散化+扫描线)
题意:有n个矩形,给出每个矩形左下角坐标和右上角坐标,求矩形覆盖两次以上的总面积。 题解:因为要覆盖两次以上,线段树要维护两个值,覆盖一次的长度和覆盖两次的长度,在区间合并的时候,如果标记是覆盖大于一次,那么覆盖一次的长度为0,覆盖两次的长度为区间长度,标记是覆盖一次,那么覆盖两次的长度是左右子区间覆盖一次和覆盖两次的和,而覆盖一次的就是区间长度减覆盖两次,如果标记为0,就是覆盖一次和覆盖两次是各原创 2015-09-07 00:27:31 · 488 阅读 · 0 评论 -
zoj 3299(区间修改+离散化)
题意:有n个由小木块组成的长条木块要掉下来,给出木块的左右区间,然后有给了m个木板的左右区间和高度用来接住木块,因为木块是由小木块接触组成的,也就是木板可以接住一部分的木块,剩下的会继续掉落,问最后每个木板上有多少个小木块。 题解:这道题用线段树可解,还有另一个比较机智的做法。 先说线段树,左右区间到3×1e7,如果用线段树解决需要离散化。把木板从低到高排序后用一个线段树flag维护每个区间对应原创 2015-08-21 19:51:03 · 877 阅读 · 0 评论 -
hdu 3016(线段树+dp)
题意:有n个木板,给出每个木板的左右端点坐标高度,还有每个木板的能量值,一个人初始能力100,从最高的木板开始,每下落到一个木板,得到这个木板的能量值,然后通过这个木板的左右移动到下一个木板,问落到横坐标为0的时候,最大能量值是多少。 题解:因为每个木板的左右端点可以确定下一个木板,明显可以用dp来从最高到最低的得出最大值,可是这里木板有100000个,可以借助线段树来维护每个木板通过左右端点到的原创 2015-09-11 01:13:33 · 522 阅读 · 0 评论 -
hdu 1542(离散化+扫描线)
题意:给出n个矩形的左下角坐标和右上角坐标,问所有矩形最后并起来的面积。 题解:应该是扫描线的模板题,先离散化横坐标,把所有矩形的上下边存起来(同时存入左右横坐标),按纵坐标从小到大排序,下边标志为1,上边标志为-1,然后从下往上的进行扫描,一旦扫描线扫到某个矩形的下边,对应区间的flag加一,线段树维护的是区间有正数flag标记的长度和,扫描线扫到上边,对应区间flag减一,如果此时flag为0原创 2015-09-04 22:20:07 · 684 阅读 · 0 评论 -
uestc 94(区间更新)
题意:有一个字符串全部由’(‘和’)’组成,然后有三种操作,query a b输出区间[a,b]字符串的括号序列是否合法,reverse a b把区间[a,b]字符串里所有’(‘替换成’)’,并且把所有’)’替换为’(‘,set a b c,把区间[a,b]的所有字符替换为c。 题解:明显是线段树,为了可以让线段树维护,判断一个字符串是否为合法括号,可以把所有的’(‘替换为-1,’)’替换为1,那原创 2015-08-20 02:15:51 · 618 阅读 · 0 评论 -
hdu 1540(区间合并)
题意:有n个村庄在一条直线上,编号从1到n,每个村庄和相邻的两个村庄有一条边,三种操作,D a表示把村庄a摧毁,Q a表示询问和村庄a连通的村庄数量,R把最近摧毁的村庄复原。 题解:线段树维护区间左右端点延伸后的连通村庄数量,Q操作可以通过查询起点和终点来计算数量。因为是复原最近摧毁的村庄所以可以用栈来保存。然后查询操作注意先递归再比较是否可以把起点终点继续扩展。#include <cstdio>原创 2015-09-04 17:41:25 · 476 阅读 · 0 评论 -
hdu 1828(离散化+扫描线)
题意:给出n个矩形的左下角坐标和右上角坐标,求所有矩形的最后的并的周长。 题解:上一题是求面积,这一题是求周长,还是要用线段树维护此时每个区间覆盖的长度,还要用线段树维护覆盖了几段,也就是不相邻的线段的数量,这样从一条边扫描到另一条边的纵坐标变化×2×段数就是竖直的矩形周长,然后横向的矩形周长只要用一个变量记录上一次的总区间覆盖长度和这一次的总区间覆盖长度的差值,累加到解里就可以了。注意线段树还要原创 2015-09-05 00:58:36 · 480 阅读 · 0 评论 -
uestc 360(区间合并)
题意:有一个长度为n的序列,然后有两种操作,Q a b是输出区间a b内最长上升子序列的长度,A a b c是把区间a b内所有数字加上c。 题解:用线段树维护区间的最长上升子序列长度,那么一个区间的最长上升子序列有三种可能,从左端点开头的一段,或者中间的一段,或者中间到右端点一段。所以线段树应该要维护liml和limr表示当前区间左端点向右延伸上升长度和右端点向左延伸的上升长度,然后在求当前区间原创 2015-08-19 20:49:31 · 700 阅读 · 0 评论 -
hdu 3308(区间合并)
题意:有一个长度为n的序列,两种操作,U a b表示把位置a上数字替换为b,Q a b输出区间[a,b]内最长的连续上升子序列长度。 题解:之前做过类似的,线段树维护每个区间最长上升子序列长度,从左端点延伸的上升序列长度,从右端点延伸的上升序列的长度,还有左右端点的值。在合并区间时注意左子区间的右端点小于右子区间的左端点时需要更新整个区间的最长上升子序列长度。#include <cstdio>#原创 2015-09-03 13:29:44 · 402 阅读 · 0 评论 -
poj 3667(区间合并)
题意:一个宾馆有n间房,标号从1到n,然后有两种操作,1 a表示找连续的a间房住人,有多个就取最左边并输出连续a间的第一间的编号,2 a b表示从编号a开始之后的b间房要清空。 题解:线段树维护三个值,区间左端点开始连续的最大数量的空房treel[k]、右端点开始连续的最大数量的空房treer[k],整个区间最大的连续空房数量tree[k],在pushup操作时注意区间合并的细节。#include原创 2015-09-03 01:11:38 · 512 阅读 · 0 评论 -
Codeforces 35E(区间更新)
题意:要建n个高楼,给出了每个高楼的左右区间和高度,问最后所有的高楼的轮廓包括了哪些点。 题解:这题好坑,用了n种姿势了还是一直wa,后来才直到必须加输入输出文件那句话才能过。。。用线段树存维护区间内最大值也就是高度,左右区间到1e9所以要离散化。因为维护的是每一段的最大值而不是点,所以划分左右子区间那里要把mid到mid+1也归到右子区间里。#include <cstdio>#include原创 2015-08-21 13:18:59 · 912 阅读 · 0 评论 -
hdu 5493(线段树)
题意:有n个人,每个人的身高和左边或右边比自己高的人的个数num[i],输出符合给出的条件且字典序最小的从左到右队列里每个人的身高。 题解:人有100000个,可以从线段树方法考虑,把问题转化为把每个人前面能留多少个空位给高个子的人,可以先按身高从小到大排个序,考虑第i个人前面留的位置肯定是num[i]或n-i-num[i]中的较小值,这样才能让字典序最小,一旦有n - i - num[i]的值小原创 2015-09-27 17:47:37 · 1882 阅读 · 0 评论 -
hdu 3954(区间更新)
题意:有n个人,每个人初始等级是1,初始经验值是0,一共有K个等级,给出到达每个等级需要的经验值,然后有q个操作,W l r e把第l个人到第r个人的经验值都加上其对应的等级×e,Q l r询问l到r人中经验值的最大值。 题解:刚开始用单点修改把每个人经验值改掉,毫无疑问的超时了,然后就想怎么把每个人获得不同的经验值在区间表示,苦逼的想不出来,然后看了题解。。。因为要维护区间最大经验值,所以就维护原创 2015-10-30 16:12:42 · 497 阅读 · 0 评论 -
poj 2528(区间修改+离散化)
题意:有一个黑板上贴海报,给出每个海报在黑板上的覆盖区间为l r,问最后多少个海报是可见的。 题解:因为l r取值到1e7,肯定是要离散化的,但普通的离散化会出问题,比如[1,10],[1,4],[4,6]普通得到答案是2,但其实是3,改进的离散化方法如果两个数字相差大于1,就在中间补一个数字。#include <iostream>#include <cstring>#include <cst原创 2015-08-18 20:52:18 · 526 阅读 · 0 评论 -
hdu 5464(01背包)
题意:有n个数字,选一些数字(也可以不选),问和是p的倍数的方案数(0也是p的倍数)。 题解:每个数字是选或者不选,明显是01背包,因为每个数字的范围是-1e9到1e9,p的范围是1000,f[i][j]表示前i个数字余数为j的方案数,状态转移方程: f[i][j] = f[i][j] + f[i - 1][j] 不选第i个数字 f[i][(j + a[i]) % p] = f[i][(j +原创 2015-09-19 22:04:17 · 569 阅读 · 0 评论 -
zoj 3525(扫描线)
题意:空间里有n个点,给出每个点的坐标和权值,然后有一个长宽高分别是lb,lw,lh的长方体可以任意放置去覆盖一些点,问能覆盖的所有点的最小权值和。 题解:线段树维护当前区间覆盖点的最大值,先把所有点按x坐标排序,然后把所有在lb距离内的所有点建立扫描线,剩下的和poj2482一样。把权值全部变为相反数求最大值,最后再输出解的相反数。#include <cstdio>#include <cstr原创 2015-09-16 20:52:02 · 409 阅读 · 0 评论 -
hdu 4419(离散化+扫描线)
题意:有三种颜色的矩形,红R绿G蓝B,然后给出每个矩形左下角和右上角坐标,矩阵重叠会形成新的颜色的矩形,颜色有RG、GR、GB、RGB,一共七种颜色,问所有矩形放好后,每种颜色的面积并是多少。 题解:一开始写挫了,RGB分别用1 2 3代表,然后pushup函数写了很长很长,后来发现如果RBG分别用1 2 4代表就能用位运算来写,代码长度顿时少了很多。3是RB也就是1|2,5是RG也就是1|4,6原创 2015-09-16 01:19:26 · 446 阅读 · 0 评论 -
uestc 449(扫描线)
题意:有n个炸弹和水果,一个长为w高为h的木板,然后给出每个炸弹或水果的坐标,问木板一次能拍到最多多少个水果且不包含炸弹,四个边界都记入统计,先输出方案数(如果是四个边界都有水果的情况,方案数加一,否则输出so many),然后输出个数。 题解:不知道怎么判断四个边界上是否有水果,看了 http://blog.youkuaiyun.com/shiqi_614/article/details/8737363的原创 2015-09-15 00:10:58 · 297 阅读 · 0 评论 -
hdu 4052(扫描线)
题意:有一个大矩形宽×高是w×h,然后有n个在大矩形内部的小矩形左下角坐标和右上角坐标给出,这些小矩形作为阻碍,让1×m的长条无法放入大矩形,问1×m的长条有多少种放法。 题解:首先能想到比起直接计算,简洁计算也就是用总的方法数-小矩形占的方法数会更容易求。然后思路就转化为计算每个小矩形占了多少种放法数。每个小矩形(x1,y1-(m-1)),(x2,y2)内的每一个点都无法作为长条的起点,所以把这原创 2015-09-14 00:16:59 · 489 阅读 · 0 评论 -
poj 2482(扫描线+离散化)
题意:有n颗星星在天空(相当于平面)上,每个星星都有自己的坐标(x,y)和亮度c,给出一个宽为w高为h的矩形可以把星星包围起来,问能包围的所有星星的亮度和最大是多少,在边界的星星的亮度不计。 题解:对于每个星星都可以确定两条扫描线,左端点是x右端点是x+w高为y边界的权值为c的一条扫描线和左右端点相同高为y+h权值为-c的扫描线,然后用线段树维护区间内亮度的最大值,不计边界上的星星可以用排序,如果原创 2015-09-07 21:28:16 · 701 阅读 · 1 评论 -
uva 11983(扫描线)
题意:有n个矩形,给出每个矩形的左下角坐标和右上角坐标,问所有矩形重叠k次以上的面积并。 题解:因为k最大是10,直接用线段树维护重叠1到k-1次的面积并和大于等于k的面积并,pushup函数更新每个重叠次数。#include <cstdio>#include <cstring>#include <algorithm>#include <map>#include <vector>#def原创 2015-09-12 15:56:35 · 690 阅读 · 0 评论 -
hdu 3255(扫描线)
题意:有n个人管理农田,每个人管理的农田都是一个矩形,给出每个矩形的左下角坐标和右上角坐标和农田里种的作物,有m种作物,每种作物有自己的生命力和价值,生命力和价值是相等的。每个单位面积的作物只能有一种,生命力最大的作物会生存下来,问价值总值。 题解:如果把每个单位面积的作物的价值当作高,转化为求长方体的体积并。#include <cstdio>#include <cstring>#includ原创 2015-09-11 23:11:15 · 414 阅读 · 0 评论 -
uva 12436(区间更新)
题意:有n个操作,操作种类有A a b表示把区间[a,b]的值依次加1 2 … b-a+1,操作B a b表示把区间[a,b]的值依次加b-a+1… 2 1,操作C a b x表示把区间[a,b]的值全部替换为x,操作S a b要求输出区间[a,b]里的所有数字的和。 题解:A和B操作都是把区间内加上一个等差数列,所以要用线段树维护每个区间所要加的等差数列的首项还有公差,注意操作C里的x还可以取负原创 2015-08-20 19:23:11 · 763 阅读 · 0 评论 -
poj 2464(区间更新)
题意:给出n个点的坐标,Stan和Ollie玩游戏,Stan会先选一个点过这个点画一条竖直的线,然后Ollie会在这条竖直的线上过一个点画一条横线,然后平面分成了四部分,Stan会将第一和第三象限上的点的数量作为自己的分数,Ollie会将第二和第四象限上的点的数量作为自己的分数,线上的点不计,Stan会采用让自己最小分数最大的方案去选择画竖线,Ollie会选择让自己分数更多的方案划线,要求输出Sta原创 2015-09-09 00:16:57 · 573 阅读 · 0 评论 -
poj 2991(区间更新)
题意:给出n个杆子的长度a[i],初始杆子的头在(0,0),尾部在(0,a[1]),第二个头在(0,a[1]),尾在(a[1],a[2]),之后都保持竖直。连续两个杆子通过一个节点连接,每个节点可以旋转一定的角度,有操作s a表示将第s和s+1的杆子之间的节点旋转,让两个杆子角度相差a°,输出每次操作后第n个节点的位置。 题解:因为旋转后s+1的杆子到最后第n个杆子的位置都会改变,但除了第s和s+原创 2015-08-19 12:43:37 · 455 阅读 · 0 评论 -
hdu 3397(区间合并)
题意:有一个长度为n的序列,由0和1组成,然后五种操作,0 a b表示把区间[a,b]内的数字全部设置为0,1 a b表示把区间[a,b]内的数字全部设置为1,2 a b表示把区间[a,b]的数字0换为1,1换为0,3 a b表示输出区间[a,b]中1的个数,4 a b表示输出区间[a,b]中连续的1的最大长度。 题解:因为要输出连续是1的最大长度,肯定合并的时候要注意。线段树维护左右端点延伸的0原创 2015-09-03 17:13:05 · 511 阅读 · 0 评论 -
uvalive 4730(并查集+区间修改单点查询)
题意:有n个城市,编号从0到n-1,给出了这n个城市的坐标,初始没有道路连通,然后有m个指令,road A B:在城市A和城市B之间连接一条双向道路,保证这条道路不和其他道路在非端点处相交。line C:询问y = C的水平线和多少个州(连通的城市成为一个州)相交,以及这些州一共包含多少座城市,C小数部分保证为0.5, 题解:因为州是连通的城市,所以要用并查集得到连通分量,两棵线段树分别记录对应纵原创 2015-08-10 16:22:23 · 1104 阅读 · 0 评论 -
ural 1855(区间更新)
题意:从城市1到城市n,每相邻编号城市之间有一条道路,初始过路费用都为0,然后有两种操作,change a b c表示城市a到城市b之间的所有道路费用加c,establish a b表示在城市a到城市b区间内任意选一个城市为起点,选一个城市为终点,输出从起点到终点通过道路的平均费用。 题解:对于每一条道路假设起点为k终点为k+1,如果知道了左右区间l r,就可以知道这条路走(k-l+1)×(r-k原创 2015-08-24 13:09:33 · 436 阅读 · 0 评论 -
uva 11525(单点修改)
题意:有一个由1到k组成的序列,最小是1 2 … k,最大是 k k-1 … 1,给出n的计算方式,n = s0 * (k - 1)! + s1 * (k - 2)! +… + sk-1 * 0!,给出s1…sk,输出序列里第n大的序列。 题解:通过找规律发现结果是可以递推的,比如第三组样例: 4 2 1 1 0 那么n = 2 * 3! + 1 * 2! + 1 * 1! + 0 * 0!原创 2015-08-09 20:38:36 · 1090 阅读 · 0 评论 -
fzu 2105(区间更新+位拆分)
题意:先给出n个数字,然后有q次询问,四种操作AND opn l r表示区间[l,r]里的数字和opn按位做&操作,OR opn l r表示区间[l,r]里的数字和opn按位做|操作,XOR opn l r表示区间[l,r]里的数字和opn按位做^操作,SUM l r表示输出区间[l,r]里所有数字的和。 题解:opn和A[i]的范围是15可以想到二进制只有4位,那么可以想到数位分离,把每一位单独原创 2015-08-23 12:20:33 · 502 阅读 · 0 评论 -
poj 3468(线段树)
题意:一个数字序列,Q a b查询a到b的数字和,C a b c从a到b都加c。题解:区间修改水题。#include #include const int N = 100005;long long addv[N << 2], sum[N << 2], x;int n, q, l1, r1;void maintain(int k, int left, int right) {原创 2015-04-10 00:08:12 · 470 阅读 · 0 评论 -
uvalive 4108(线段树)
题意:有一条街上要盖高楼,按先后顺序给出要建的楼的左右范围和高度,在修完一个建筑后,统计它在多长的部分是最高的(并列最高也可以),叫做覆盖度,要求把所有的建筑物的覆盖度和求出来。题解:线段树区间修改,如果当前要覆盖的高度是大于之前最大高度就覆盖掉,否则维持现状,为了减少判断,可以把最小高度也求出来,如果小于最小高度直接return。#include #include #include原创 2015-04-08 20:29:06 · 1000 阅读 · 0 评论 -
hdu 5023(线段树)
题意:有一个人要在墙上刷漆,先把墙上分为n块,全部刷成颜色2,然后两种操作P a b c表示把区域a到b刷成颜色c,Q a b表示问区域a到区域b有哪几种颜色。题解:看大牛思路是用状态压缩,有哪种颜色就标记哪一位,然后用线段树区间修改就可以了,最后查询判断当前区间是的数字哪些位上是1,解中就有这种颜色。。#include const int N = 4000000;int n,原创 2015-04-08 00:35:52 · 590 阅读 · 0 评论 -
uva 11992(线段树)
题意:有一个行r,列c的矩阵的初始值都为0,然后有三种操作,子矩阵(x1,y1,x2,y2)全部元素都增加v或置为v,或者查询这个子矩阵的元素和、最大值、最小值。题解:区间修改模板题,把每行当做一个线段树。#include #include #include using namespace std;const int N = 50000 * 4;const int INF =原创 2015-04-06 23:41:27 · 670 阅读 · 0 评论 -
uvalive 3989(线段树)
题意:给出长度是n的数字序列,然后给出位置x, y,问在[x, y]这个范围内有最大和的连续子序列的范围是什么。题解:和普通的线段树不太一样,还加入了连续子序列,求连续子序列最大和的方法有个是把序列分成三部分,最大和的起点终点可能都是左边部分,可能都是右边部分,也可能起点在左边,终点在右边,那么在用线段树时也要这样,用一个结构体表示线段树的一个结点,有左端点和右端点,也有包含在左端点和右端原创 2015-04-05 20:49:18 · 712 阅读 · 0 评论 -
uva 12299(线段树)
题意:线段修改时要把选出来的数字全部右移一位修改掉。题解:单点修改线段树模板题,把挑出来的逐个单点修改就好。#include #include #include using namespace std;const int N = 400000;const int INF = 0x3f3f3f3f;int s[N], l[N], r[N], a[N], b[N], b1[N];原创 2014-12-28 21:15:22 · 761 阅读 · 0 评论 -
hdu 1166(线段树)
题解:单点修改模板题#include #include #include using namespace std;const int N = 200000;const int INF = 0x3f3f3f3f;int s[N], l[N], r[N], a[N], l1, r1, u, x;int flag;void build(int k, int left, int ri原创 2014-12-28 21:12:01 · 678 阅读 · 0 评论 -
hdu 4578(区间更新)
题意:有长度为n的序列,初始都为0,然后有四种操作,1 a b c表示区间[a,b]所有数字加c,2 a b c表示区间[a,b]所有数字都乘c,3 a b c表示区间[a,b]所有数字都设置为c,4 a b p表示输区间[a,b]所有数字的p次方的和,结果模10007。 题解:因为p的取值是1到3,可以开三个线段树分别维护区间内p次方的和,根据(a+c)^2 = a^2+2ac+c^2,(a+c原创 2015-08-25 14:15:54 · 417 阅读 · 0 评论