
数据结构-线段树&树状数组
文章平均质量分 79
Flynn_curry
这个作者很懒,什么都没留下…
展开
-
hdu1556 Color the ball(树状数组)
啊沙发原创 2016-04-29 21:34:06 · 318 阅读 · 0 评论 -
poj3277 City Horizon(矩形面积并)
http://poj.org/problem?id=3277题意:给你跨度a,b,楼房高度h,求平面覆盖的面积。思路:矩形面积并的特殊情况,下边y2都为都为0。ps:这题因为最后输出忘了加64位输出又WA了几次,看来今天不适合做题污污污。。#include #include #include #include #include using names原创 2016-05-18 21:37:53 · 381 阅读 · 0 评论 -
hdu3265 Posters(切割+面积并)
http://acm.hdu.edu.cn/showproblem.php?pid=3265题意:给你n张海报,都是带洞的,求整体面积并。思路:把一个带洞矩形纵向切割成四个小矩形,每输入一组数据插入4个矩形,然后就是普通的面积并。记得两个结构体和离散数组都开八十万,就是因为离散数组开了十万WA了好几次。还有这题不能用c++提交。。#include #inclu原创 2016-05-18 22:07:16 · 397 阅读 · 0 评论 -
hdu1542 Atlantis(矩形面积并+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1542题意:给你n个矩形,求他们的周长面积并。思路:看了两篇比较好的博客,推荐下第一个、第二个。求面积时要想用扫描线,首先要确定水平还是竖直方向。这里是从下往上扫描,由于横坐标较大所以对其离散化。离散化还是保存排序去重的步骤,重点是对这里扫描的理解。必须要注意的是,扫描线是可变的。提前用seg原创 2016-05-15 09:17:04 · 403 阅读 · 0 评论 -
poj2482 Stars in Your Window(成段更新+扫描线)
http://poj.org/problem?id=2482题意:给你n个星星的x,y,val,求用一个长w宽h圈住的最大亮度的值(还有这题前缀长的不忍直视啊)。思路:这题关键点在于对问题的转化,按照最笨的暴力枚举只会超时。这里我们设刚开始给的框代号X,以ABC点为中心临时做出来的框为代号ABC...。我们知道一个矩形的中心点可以代表它的位置,那么以A为中心,作w、h的矩形A,原创 2016-05-19 20:39:15 · 571 阅读 · 0 评论 -
hdu4973 A simple simulation problem.(成段更新+下标转化)
http://acm.hdu.edu.cn/showproblem.php?pid=4973题意:给你一串连续升序数字和两种操作,D表示将[l, r]区间内的元素个数加倍,Q表示查询[l,r]区间内的最大元素个数。ps:看的别人的博客。。草。。思路:既然元素再怎么加倍也总是连续的,那么每个不同元素当做线段树子节点,开一个sum域表示同种元素的个数。于是难点就转化为了原创 2016-05-19 20:48:16 · 459 阅读 · 0 评论 -
hdu1541 Stars(树状数组+解释)
http://acm.hdu.edu.cn/showproblem.php?pid=1541题意:有n个星星,输入时是以从下到上,从左到右的方式输入(x,y)的值。每个星星左下方有多少个星星就评多少等级,求0~n-1个等级分别有多少个星星。思路:树状数组入门题,第二次做。首先上博客,这篇写的很好,看完就懂了。树状数组主要用的是二进制思想,相比于普通数组在更新和求和上从O(n)优原创 2016-04-28 08:35:36 · 781 阅读 · 0 评论 -
gplt L3-002. 堆栈(单点更新求区间第k大)
https://www.patest.cn/contests/gplt/L3-002题意:普通的入栈出栈操作和PeekMedian。PeekMedian的作用是求当前栈中第几小的数。思路:没做过主席树,好像第一次用线段树求区间第k大,query那里卡了好半天,看了别人的。。线段树中每个节点的值代表在这个区间内有多少个元素。tree的val值刚开始被赋予0,代表没有这个数原创 2017-03-14 19:00:01 · 818 阅读 · 0 评论 -
poj3928 Ping pong(树状数组)
http://poj.org/problem?id=3928题意:有n个乒乓球选手,住在一条直线上,从左到右依次输入。每个选手有一个技术等级值。他们想打比赛,就要找裁判,为了省时和公正,选裁判的条件为裁判的位置和技术等级都在两位选手之间,求能打多少场比赛。思路:N久没做树状数组,刚开始根本就是一脸蒙蔽,看了题解。树状数组解决的是根据特性求数量(比如Stars那道根据x坐标大小求原创 2017-03-02 21:25:50 · 480 阅读 · 0 评论 -
poj2481 Cows(树状数组)
http://poj.org/problem?id=2481题意:农民发现山上长了一排三叶草,他有n个牛。每个牛都有自己喜爱的吃草范围[st,ed],如果说牛i的st比j的小,ed比j的大,就说牛i比牛j强壮。问每头牛都有多少头牛比自己强壮。思路:说白了就是求有多少区间覆盖了当前区间。同样的也是10^5^2的大数据,用数状数组,不过用树状数组处理区间还是第一次。比牛j强的牛i要原创 2017-03-03 18:28:13 · 508 阅读 · 0 评论 -
poj1195 Mobile phones(二维树状数组)
http://poj.org/problem?id=1195题意:(一大坨的题)给你4种操作,0代表输入矩阵的宽度建立矩阵,1代表对矩阵中第x行y列的数加上a,2代表对坐标点(l,b)~(r,t)矩阵内的所有点求和并输出,3代表退出。思路:首先看教程,二维树状数组说白了就是横向为1,2,1,4,1,2,1,8这样的树状数组,纵向也为1,2,1,4,1,2,1,8这样的树状数组,原创 2017-03-03 21:30:58 · 414 阅读 · 0 评论 -
poj2155 Matrix(经典二维树状数组)
吐槽:这题先说[x1,y1]和[x2,y2]是左上角和右下角的两个点,又说x1http://poj.org/problem?id=2155题意:输入n*n矩阵,有两个操作,C代表翻转[x1,y1]到[x2,y2]矩阵内的值(0变1,1变0),Q代表查询某点的值。思路:和普通的单点更新和求和不同,这里是区间更新和单点求值。重点在于翻转操作,矩阵大操作多肯定不能一个一个原创 2017-03-04 13:37:13 · 763 阅读 · 0 评论 -
poj2828 Buy Tickets(单点更新模拟队列)
http://poj.org/problem?id=2828题意:买票时需要排队,但是这里可以插队,通过每个人的插队操作后形成一队。有n个人,每人都有想插的位置pos和权值val,输出最后的权值顺序。操作数量大。思路:比较经典的单点更新。看了别人的才知道,这篇模拟的不错。第一个人先选一个位置,第二个人再选,就可能改变前一个人的位置。第三个人再选,前两个人的位置可能都会改变。原创 2016-04-30 20:36:58 · 500 阅读 · 0 评论 -
poj2182 Lost Cows(经典单点更新)
http://poj.org/problem?id=2182题意:每个牛有1~n中的一个序号,给你从第二个牛开始每个牛以前比其序号小的牛的个数,求最后每个牛的序号。思路:这题虽然和poj2828相像,但是第一眼不容易看出来,看不出来就没法使线段树。poj2828是已知每个数的序号求位置,特点是越靠后选的位置越准确;poj2182是已知每个数的位置求序号,特点是越靠后选的原创 2017-03-04 21:48:57 · 501 阅读 · 0 评论 -
hdu3308 LCIS(区间求和)
http://acm.hdu.edu.cn/showproblem.php?pid=3308题意:给你n个数m个操作,U为更新x节点值为num,Q为查询[l,r]区间内的最长连续上升子序列的长度。思路:更新节点属性时在普通区间求和更新的基础上加一个判断前后值大小的条件,需要注意的是查询时中值落在区间内部,在区间之间的间隔那段需要判断是否越界。判断越界是区间合并相对于其他线段树类原创 2016-05-17 21:34:22 · 371 阅读 · 0 评论 -
poj3468 A Simple Problem with Integers(成段更新)
http://poj.org/problem?id=3468题意:给你n个数q个操作,q查询,c为某一段内的值增加一定的增幅。思路:本来想自己敲出lazy,失败了。。看了别人的,增加add域,在查询和更新区间内每次判断该节点是否有增量。若有,则说明递归到了此节点,但不是所求的区间,也就没有价值了,将价值传递给儿子节点,add和sum同时更新。这里sum求和时,每次都是在原有的基原创 2016-05-15 21:57:31 · 336 阅读 · 0 评论 -
hdu1394 Minimum Inversion Number(单点更新)
艾弗森原创 2016-04-29 21:34:42 · 318 阅读 · 0 评论 -
hdu1754 I Hate It(单点更新)
单点更新求最值,简单改改就行,不过比敌兵布阵数据量大一点。#include #include #include #include #include using namespace std;typedef long long LL;const int N = 200010;const int INF = 1e8;struct line{ int l;原创 2016-04-29 21:34:23 · 369 阅读 · 0 评论 -
hdu2795 Billboard(单点更新)
这里h是宽,w是长,刚开始老是翻不过来。。然后要想清楚,这里处理的是宽度,所以以宽度作为线段建树。注意优化,因为最坏情况也就每行贴一张告示(告示宽度为1),所以树的最长宽度也就n,不处理这一步,这个树就建不起来,所以运行错误。#include #include #include #include #include #include using namespace原创 2016-04-30 10:13:27 · 305 阅读 · 0 评论 -
hdu4027 Can you answer these queries?(成段更新)
成段更新,操作为0时对节点值开根号,操作为1时区间求和。区间求和和上一道题一样,只不过数据量大些。主要是对节点开根号,向下取整直接强制转换就好,还要记得剪枝。因为2^63次大约开方8次就变成了1(比赛时候我要得出这个结论估计还得算半天。。),所以最多到8层就没必要再往下走了。判断条件就是tree[i].l == l && tree[i].r == r && tree[i].value原创 2016-04-30 10:04:40 · 303 阅读 · 0 评论 -
poj3368 Frequent values(成段更新+离散化求最值)
http://poj.org/problem?id=3368题意:给定一个非降序序列,求出其中最大连续区间长度。思路:只想了线段树。直接用普通线段树的话,处理区间拆分后的数总是无法合并,因为两边都求的是最值,合并后不一定是同一元素的最值。所以就将其离散化,值相同的节点都合并为一个相对节点,这个节点统计出相对节点的左右极限以及对应数字的数量,再将原始位置和相对位置做一个映射f[l原创 2016-05-11 09:25:16 · 439 阅读 · 0 评论 -
hdu1540 Tunnel Warfare(线段树区间合并详解)
http://acm.hdu.edu.cn/showproblem.php?pid=1540题意:给你一些村庄,D代表毁灭该村,R代表恢复该村,Q代表和x村相连的未被毁灭的村庄。前两者明显就是单点更新了,查询的时用到了区间合并。区间合并果然麻烦,连想带懂几乎花了我将近三天,不过好在做掉了。思路:注释都在代码里了,适合入门。总的来说,增加了三个域ls, r原创 2016-04-30 10:46:14 · 693 阅读 · 0 评论 -
poj2886 Who Gets the Most Candies?(单点更新+约瑟夫环+素数打表)
http://poj.org/problem?id=2886题意:N 个小孩围成一圈,他们被顺时针编号为 1 到 N。每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的,则是右手边的第 -A 个小原创 2016-05-04 21:47:35 · 369 阅读 · 0 评论 -
poj3667 Hotel(成段更新+区间合并)
http://poj.org/problem?id=3667题意:给你n个房间,m种操作,1操作为查看有没有连续长度为num的房间,若有,则返回其左端点,并将其置为非空;2操作为置空st~st+num-1区间内的房间。思路:这题就是区间合并和成段更新的完美结合,然后加上懒惰标记的思想。麻烦就麻烦在对各变量的更新查询操作,以及要理解透彻几个变量的意义。ls代表从左数最长连续区间,原创 2016-05-11 22:04:47 · 367 阅读 · 0 评论 -
hdu1698 Just a Hook(成段更新+懒惰标记)
http://acm.hdu.edu.cn/showproblem.php?pid=1698线段树成段更新,这里用到了懒惰标记,简单说一下。单点更新只是针对一个点,所以改了该点即可。但是成段更新一旦改一个区间,那么其所支配的节点都要更改,这样复杂度就增加。为了避免这种情况,懒惰标记就产生了。他只给对应的线段节点赋值,其下节点都不改变。但是当这个节点不是所查找的线段时,就原创 2016-04-29 22:00:39 · 382 阅读 · 0 评论 -
poj2777 Count Color(成段更新)
http://poj.org/problem?id=2777题意:给你一个长板,宽度为l,t种颜色,o项操作。操作共两种,更新一个区间内的颜色,求一个区间内的颜色数量,输出。思路:比较普通的成段更新,用mark统计颜色数量,不多说了。#include #include #include #include #include using namespace原创 2016-05-09 21:18:42 · 339 阅读 · 0 评论 -
poj2528 Mayor's posters(成段更新+离散化)
http://poj.org/problem?id=2528题意:基本和上一题板子上涂颜色一样,只不过这题数据量超大。。思路:把一条条线段离散化。这题的离散化原理:题中区间:[1,4][2,6][8,10][3,4][7,10],排序去重后变成1,2,3,4,6,7,8,10赋其序号为1,2,3,4,5,6,7,8 这样就减少了空间,但是不影响线段划分。将新原创 2016-05-09 21:21:07 · 353 阅读 · 0 评论 -
hdu1828 Picture (矩形周长并+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1828题意:给你n个矩形,求他们的周长并。思路:求周长并本来应该是两种做法,一种是水平竖直扫描两次,一种是从下到上扫描一次,第二种比较常见。这里是第二种,方法是每扫描一次边,就将其对应的竖线统计好。而竖线的高度就是两边高度之差,麻烦的就是有多少根竖线,这样的话我们就必须统计有多少根不想连的横线原创 2016-05-15 09:58:10 · 698 阅读 · 0 评论 -
hdu1255 覆盖的面积(矩形面积交+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1255题意:给你n个矩形,求他们的面积交。思路:和hdu1542基本一样,只不过这题是求面积交。len1代表线段被覆盖一次,len2代表线段被覆盖两次。关键点就在节点的长度更新上。因为这里求面积的长必须是覆盖1次以上,所以线段树节点中增加变量len2,用于记录被覆盖一次以上区间的长度。原创 2016-05-15 10:33:02 · 699 阅读 · 0 评论 -
hdu1166 敌兵布阵(树状数组 && 线段树单点更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1166题意:有n个营地,三个操作,Add x y代表在x营地增加y人,Sub x y代表在x营地减少y人,Query x y代表查询[x,y]区间内营地人数之和。树状数组:思路:由于只涉及单点更新和区间求和,树状数组也可以。树状数组里的sum求的是1~n-1的和,那么求区间和就原创 2016-04-28 09:11:36 · 1340 阅读 · 0 评论