![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构-线段树&树状数组
文章平均质量分 78
FDU_Nan
去做一个会思考,善于思考的人儿。
展开
-
hdu 1166 敌兵布阵(线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=1166人生第一道线段树题目,一直觉得线段树好高端。。该题应该是线段树最简单的问题,单点增减,包括建树,查询,更新。#include #include const int maxn = 50005;//线段树节点定义,表示某一线段的左端点,右端点,以及该区间的人数之和struct原创 2014-02-10 14:41:06 · 836 阅读 · 0 评论 -
V - Ice-cream Tycoon(线段树)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=216#problem/V有两种操作,ARRIVE a b 表示单价为b的冰激凌的进货数目为a,BUY a b表示同学共拿b元钱,想买a个尽量便宜的冰激凌,若能购买到,输出"HAPPY",否则输出"UNHAPPY”操作挺简单,单点更新然后push_up。但是写起来感原创 2014-08-23 20:50:58 · 906 阅读 · 0 评论 -
X - Calculate the Function(线段树+矩阵)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=216#problem/X给出一个序列,在区间[l,r]内定义一个函数f(x),其中f(l) = a[l],f(r) = a[r],f(x) = f(x-1) + f(x-2)*a[x](x >= l+2)。对于每一个询问区间[l,r],输出f(r)。刚原创 2014-08-23 15:55:13 · 845 阅读 · 0 评论 -
hdu 4973 A simple simulation problem.(线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=4973有两种操作D l r 将【l,r】区间翻倍Q l r询问[l,r]中相同数字出现的最多次数比赛的时候脑子太乱了,没有想到怎么做。发现每次翻倍序列的长度都在变化,区间对应的数也在变,没有思路。但是静下心来想一想,思路还是挺清晰的。无论怎么翻倍,序列中的数都是连续的,范围原创 2014-08-22 23:22:49 · 1130 阅读 · 4 评论 -
Kalevich Strikes Back(扫描线求分块的面积)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=216#problem/W大致题意:有一个W*H的矩形,它的左下角是(0,0),右上角是(W,H),在这个大的矩形内有n个小矩形,这n个小矩形可以包含但不能相交,n个小矩形把W*H的大矩形分成n+1块,按从小到大的顺序输出每一块面积。首先先计算出每个矩形的面原创 2014-08-10 14:03:27 · 860 阅读 · 0 评论 -
hdu 4288 Coder
http://acm.hdu.edu.cn/showproblem.php?pid=4288初始有一个空集合,有N个操作,1 add x向集合中加一个元素x,2 del x在集合中删除一个元素x,sum询问下标mod 5为3的元素的和。建立一棵线段树,能够实现数组中元素的删除和添加,维护区间的和。重点是怎么在元素随时变动的条件下求下标mod 5 为3的数的和。首先节点有原创 2014-08-21 09:51:04 · 766 阅读 · 0 评论 -
E - Mex
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=216#problem/E又是一道线段树神题。对一个非负序列,定义mex(i,j)为区间[i,j]内没出现最小的正整数。求所有满足(1 以序列1 2 0 4 6 3 5 7 1 2 4 5 8为例,先把以i = 1的mex(1,j), i = 2的mex原创 2014-08-20 18:48:01 · 1058 阅读 · 0 评论 -
G - Vases and Flowers(线段树+二分)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=216#problem/G有n个花盆编号0-n-1,初始都没有种花,有两种操作:1 a b 从a开始种花,但a处不一定能种,要种b朵花,若花盆中已种花就跳过不种,直到n-1,若b朵花种不完就扔掉,输出种b朵花的花盆左右端点。2 a b要清理[a,b]的花盆,先输原创 2014-08-20 11:18:55 · 806 阅读 · 0 评论 -
hdu 4578 Transformation
http://acm.hdu.edu.cn/showproblem.php?pid=4578又做了一道好题。。有三种操作:1 a b c [a,b]加上c2 a b c [a,b]乘上c3 a b c [a,b]变为c4 a b c 求[a,b]的c次方和(1这题首先需要解决的第一个问题是加上或乘上一个数对这个区间的c次方和分别产生什么改变,很简单,一化原创 2014-08-19 21:49:23 · 1087 阅读 · 0 评论 -
L - Colourful Rectangle(面积并加强版)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=216#problem/L花了两个多小时才写完,结果一直RE。我用1 2 4表示三原色,结构体里有两个信息:sta(1~7)表示这段区间的颜色状态,len[8]表示这段区间每种颜色的长度。后来想想这样处理不对,因为同一区间可能会被同一种颜色多次覆盖。但是我在sta中原创 2014-08-24 16:01:44 · 896 阅读 · 0 评论 -
poj 2750 Potted Flower(线段树区间合并)
http://poj.org/problem?id=2750有n个数围成一个圈,每次可以将a位置上的数变为b,对每个操作,输出区间的最大连续子段和,连续的子段长度不能超过n。区间合并问题,因为是求连续子段的和。先把圈从1和n之间断开,变为一条链,先在链上求最长连续的和。这个最长连续的和取左节点最长连续和,右节点最长连续和,左节点从右边数最大连续和加上右节点从左边数最大连续和原创 2014-08-25 10:00:46 · 1203 阅读 · 0 评论 -
poj 1195 Mobile phones(二维树状数组基础)
http://poj.org/problem?id=1195题意:有一个s*s的方格,有两种操作,给某个方格a[x][y] 加上一个数add 和 询问某一个子矩阵内所有数字的和。思路:二维树状数组的模板。。要注意的是题目中的下标从0开始而树状数组的下标从1开始,所以下标均向右移一位。#include #include const int maxn = 1030;int原创 2014-02-13 10:05:26 · 738 阅读 · 0 评论 -
poj 2352 Stars(树状数组基础)
http://poj.org/problem?id=2352题意:有若干个星星,给出每个星星在二维平面上的坐标(输入按y递增顺序给出,y相同时按x递增顺序输出)。定义每个星星的级别为 横纵坐标均不超过自己的星星的个数(不包括自身)。问级别为0~n-1的星星分别有几个。思路:首先将二维转化为一维。。因为输入是有顺序的,当前星星与后面的星星并没有关系。对于第i次输入的星星(横纵坐标为x,y),原创 2014-02-12 21:33:20 · 950 阅读 · 0 评论 -
poj 3225 区间(区间的交并补操作)
http://poj.org/problem?id=3225一道题又做了一天。。这道题对我来说起初有N多难点。1:区间的开闭如何解决。、2:怎样把区间的交并补、对称差转化为对线段树的操作。后来与实验室的同学讨论了后解决了前面两个问题。对于区间的开闭,可以将区间放大一倍,偶数点表示端点,奇数点表示区间内线段,前开的话左端点加1,右开的话右端点减1。例如[1,3]可以表示成原创 2014-08-17 20:24:39 · 2193 阅读 · 1 评论 -
hdu 1394 Minimum Inversion Number(逆序对数+线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=1394题意:给定无序的n个数 0~n-1,可以这样变幻得到n的不同的序列:每次将序列中第一个数放到最后一个。问在这n个序列中逆序对数最少是多少?思路:已知逆序对数的定义后,可以直接暴力求原序列的逆序对数,设为sum;可以发现以后n-1个的序列的逆序对数就知道了,不难证明,两个相邻序原创 2014-02-11 17:55:39 · 1152 阅读 · 0 评论 -
hdu 1255 覆盖的面积(扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1255一道挺简单的题,让我折腾了许久。主要卡在了更新节点后维护父亲节点上。后来思路明确了就很容易了。节点信息:l,r:区间端点cnt:区间被覆盖的次数,cnt = 0说明没有被完全覆盖。len1:区间被覆盖的长度len2:区间至少被两条线段覆盖的长度。只要找到父亲节点与原创 2014-08-16 19:19:15 · 944 阅读 · 0 评论 -
poj 1177 Picture(扫描线+矩形周长并)
http://poj.org/problem?id=1177求矩形的周长并,明确的一点是对于覆盖的边的长度忽略不计。与求面积并类似,首先离散化,对矩形的每条横边从下往上扫描。扫描过程中要完成三个任务,更新相应的区间信息,求横边长,求竖边长。节点信息:l,r:左右区间编号cnt:表示该区间是否被完全覆盖。cnt > 0 表示完全覆盖,否则不完全覆盖。lp,rp原创 2014-08-15 13:24:48 · 1242 阅读 · 0 评论 -
T - Can you answer these queries?(单点更新,线段树优化)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=216#problem/T对n个整数有m个操作,共有两种操作:0 l r表示把区间[l,r]之间的数开方,1 l r表示询问[l,r]的和。开方即单点更新。但所有的数都单点更新和模拟每什么差别。重点就是成段维护区间的和,因为当操作次数相当多时,这些数大部分就原创 2014-08-16 19:53:43 · 783 阅读 · 0 评论 -
U - Count the Colors(成段更新+统计)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=216#problem/U有n个操作,每个操作定义为x1,x2,c,表示把区间[x1,x2]染成c色,区间可重复染色,最后问每种颜色存在几个间断的区间中。注意是对区间进行染色,而不是点。成段更新很简单,在统计每种颜色所在间断的区间时,先把线段树中节点信息原创 2014-08-15 19:36:37 · 836 阅读 · 0 评论 -
poj 2528 Mayor's posters(离散化+线段树)
http://poj.org/problem?id=2528题意:市长竞选,每个市长都往墙上贴海报,海报之间彼此可以覆盖,给出粘贴顺序和每个海报的起点和终点,问最后又多少海报时可见的。刚接触离散化,先写一写本人的理解:如果原数据太大,建树会超内存。因此可以先对这些数排序,然后将它们映射成排序后的序号。比如在该题中,[1,4],[2,6],[8,10],[3,4],[7,10原创 2014-02-10 19:11:27 · 1326 阅读 · 0 评论 -
hdu 3379 Sequence operation(成段更新,区间合并)
http://acm.hdu.edu.cn/showproblem.php?pid=3397线段树很好的题。涉及到的知识点:lazy操作,区间合并。有五种操作:0 a b 将[a,b]变为01 a b 将[a,b]变为12 a b 将[a,b]取反3 a b 输出[a,b]的1的个数4 a b 输出[a,b]内最长的连续1的个数对区间的操作与poj 3225原创 2014-08-18 19:19:48 · 965 阅读 · 0 评论 -
hdu 1698 Just a Hook(线段树 成段更新+总区间求和)
http://acm.hdu.edu.cn/showproblem.php?pid=1698题意:给定一根棒的长度,它上面有价值1,2,3种,初始价值为1,每次输入的x,y,z表示把区间[x,y]的价值全部变为z;问最后这根棒的总价值是多少。思路:与书中对某一线段[x,y]同时加上z类似,只不过这个是把线段[x,y]变成z。属于线段树成段更新问题。。成段更新与单点更新就不同了。原创 2014-02-11 10:54:31 · 1108 阅读 · 0 评论 -
poj 2828 Buy Tickets(线段树单点更新)
http://poj.org/problem?id=2828题意:有n个人,每个人对应一个value,它们按次序插入到自己想插入的位置(从0开始),问最后队列的状态是什么样的。 看懂题意后真想不到用线段树怎么做,只知道单点更新。看了大神的思路才明白,应该逆序插入线段树中。因为最后一个人肯定能在它想在的位置,在线段树中找到它的位置后将其删除,也就是将它忽略掉,因为倒数第二个人的位置选原创 2014-02-10 21:26:49 · 843 阅读 · 0 评论 -
Poj 3928 Ping pong(树状数组)
http://poj.org/problem?id=3928题意:有n个乒乓球爱好者,每个人都有不同的权能值a[i],每场比赛需要三个人,两名选手,一名裁判。有规定,裁判必须住在两名选手中间,并且技能值也要在两名选手中间。问一共能组织多少场比赛。思路:只考虑第i(2 求c[i]:从左到右扫描所有的a[i],令x[j]表示到目前所有的a[i]中是否存在一个a[i] == j( x原创 2014-03-19 19:03:26 · 1335 阅读 · 0 评论 -
POJ 3321 Apple Tree(树状数组+DFS)
http://poj.org/problem?id=3321一道搁置了好多天的树状数组题意:有一颗苹果树,主干是1,下面会有分支,每个分支一个编号一直到n。每个分支只能有一个苹果或没有苹果。初始状态是每个分支一个苹果。示例: 5 1 2 1 3 3 5 3 4它形成的树是这样的:现在每个分支的苹果都是1。下面是两种操作,Q原创 2014-02-19 20:21:57 · 1236 阅读 · 0 评论 -
线段树个人总结
从2.10到2.17,线段树已经断断续续的刷了七天了。刷题计划是根据http://www.notonlysuccess.com/index.php/segment-tree-complete/comment-page-3/#comment-5250来的,不过只刷了相对代表性的题目。线段树的应用十分灵活,以后还要继续。这里写一写个人做题的总结,方便以后复习用。总体上线段树的题目共分为4部分,单点原创 2014-02-17 21:05:52 · 1126 阅读 · 0 评论 -
树状数组----算法高级专题
lowbit (i):i&-i 或者i=i&(i^i-1)9 and -1 1、要点:一个数i对应二进制表示未尾0的个数为k,那么他管辖的范围为:从i到左边i-2(k)+1的2(k)个元素。如:i:6 110 k=1 6管辖的范围为:C[5]=a[5]+a[6]; 2(1) 管2个。2、求前N个元素的和,N的二进制的最后一个1减去。如:N=7;111à110(6)->转载 2014-02-13 10:09:29 · 863 阅读 · 0 评论 -
数据结构之线段树
PS:虽然本文有概念上的疏漏,但个人觉得对于线段树讲解的十分透彻,值得仔细品味。1、概述线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,它基本能保证每个操作的复杂度为O(lgN)。2、线段树基本操作线段树的基本操作主要包括构造线段树,区间查询和区间修改。(1) 线段树构造首转载 2014-02-12 20:43:20 · 782 阅读 · 0 评论 -
poj 3368 Frequent values(离散化+线段树区间求最值)
http://poj.org/problem?id=3368题意:给定一个非递减序列和若干个询问,序列中的数有可能是相等的,每个询问输入l,r,问在区间[l,r]相等的数中所含个数最多的是多少?比如 -1 -1 1 1 1 1 3 10 10 10 ,若询问[1, 10],则答案应该是4,因为在区间[1,10]中连续相等的数中个数最多的是1,有4个。思考加发呆有半个小时,也原创 2014-02-13 16:04:12 · 1172 阅读 · 0 评论 -
poj 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
http://poj.org/problem?id=3468题意:有n个数和两种操作,"C A B C"和" Q AB",“C A B C”表示区间A~B的数均增加C," Q AB"表示询问区间A~B的和。思路:是典型的线段树成段更新和区间求和问题。不过我被书上误导了,导致调试了一下午,最后搞得特晕。所以,还是要相信自己的想法,不要完全依赖别人的。。。区间线段更新时,有向上原创 2014-02-12 19:08:49 · 1022 阅读 · 0 评论 -
poj 2886 Who Gets the Most Candies?(线段树单点更新模拟约瑟夫环)
http://poj.org/problem?id=2886题意:N 个小孩围成一圈,他们被顺时针编号为 1 到 N。每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的,则是右手边的第 -A 个小孩。游戏将直原创 2014-02-11 21:32:08 · 966 阅读 · 0 评论 -
poj 2777 Count Color(线段树 Lazy-Tag思想 成段更新+区间统计)
http://poj.org/problem?id=2777题意:给定一个长为L的棒,它可以分成若干个整数区间。有最多30种颜色,棒上最初的颜色为1,每次操作有'C'和'P'两种:C A B C 表示给区间[A,B]涂颜色C,P A B 表示[A,B]区间涂了多少种不同的颜色。思路:这个题与poj2528贴海报类似,涂色问题。之前做poj2528时并不知道这个思原创 2014-02-11 15:22:10 · 1275 阅读 · 0 评论 -
hdu 1754 I Hate It(线段树单点更新及区间最值)
http://acm.hdu.edu.cn/showproblem.php?pid=1754做了hdu 1166以后,感觉这个题好简单,只不过那个是区间求和,这个是区间求最值而已。。。#include #include #include using namespace std;const int maxn = 200005;struct line{ int原创 2014-02-11 09:04:32 · 1049 阅读 · 0 评论 -
poj 2482 Stars in Your Window(线段树+扫描线)
http://poj.org/problem?id=2482题意:给出n个星星的坐标的亮度,一个矩形的宽和长,分别是w和h。问这个矩形能够框住的星星的最大亮度是多少。看的解题报告,愧疚中。。。直接说思路吧。解题:将每个星星分成两个星星(x,y,val)和(x+w,y,-val)。当不断加入星星的时候相当于一个矩形框从左向右移动,当遇到第一个星星总亮度加上val,说明框住了该原创 2014-02-17 18:53:53 · 870 阅读 · 0 评论 -
hdu 4893 Wow! Such Sequence!
http://acm.hdu.edu.cn/showproblem.php?pid=4893三种操作:1 k d - "add"2 l r - "query sum"3 l r - "change to nearest Fibonacci"节点附件三个值:s1:由lazy控制的区间的正确的和。s2:区间内与所有数相近的fib数之和,随着单点更新而更新原创 2014-08-05 08:55:45 · 813 阅读 · 0 评论 -
hdu 1542 Atlantis(线段树 面积并+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1542题意:给n个矩形的左下角和右上角的顶点坐标,求n个矩形的面积并。思路:首先离散化,因为矩形端点坐标非常大。如果从下向上扫描,离散横坐标,如果从右向左扫描,离散纵坐标。这里,离散横坐标,从下向上扫描。离散时,先对横坐标排序,去重,最后每个下标对应一个横坐标。再对离散后的横坐标建树。用结构体原创 2014-02-17 11:02:24 · 1395 阅读 · 0 评论 -
poj 3667 Hotel(线段树,成段更新,区间合并,Lazy思想)
http://poj.org/problem?id=3667题意:有n个连续的房间,m个操作,共有两种:1 num 询问是不是有连续长度为num的空房间,若有,输出连续房间的最左边端点。2 st num 将 [st,st+num-1]的房间清空。本来想自己敲出这道题,敲到查询的时候没有思路,最后看解题报告,然后自己敲,一直没找到错误。。重敲一遍终于过了。。这道题是很经典的线段树原创 2014-02-15 19:07:19 · 2516 阅读 · 1 评论 -
poj 3264 Balanced Lineup(RMQ线段树)
http://poj.org/problem?id=3264题意:输入n个数,有m个询问,每个询问输入l,r,求区间[ l , r ]之间最大数与最小数之差。思路:我用的线段树过的,节点增加两个域,分别记录该区间的最大值和最小值。然后设置全局变量maxh和minh动态维护区间[ l, r]中的最大值和最小值。不过线段树过时间不是一般的慢,3s+。。。#include原创 2014-02-13 12:41:10 · 941 阅读 · 0 评论 -
poj 2892 Tunnel Warfare(线段树 单点更新 区间合并)
http://poj.org/problem?id=2892题意:有n个连续的村庄,编号1~n,有三种操作:D X:摧毁X村庄; R:修复后摧毁的村庄(后摧毁的先修复);Q X:询问与X村庄有直接或间接相连的村庄数。思路:与poj 3667类似,都是求满足条件的连续最长区间,属于区间合并问题。不过这个相对简单,因为这个是单点更新,不用考虑延迟操作。求最长连续区间长度时,一般节点原创 2014-02-16 20:46:48 · 1015 阅读 · 0 评论 -
poj 2155 Matrix(树状数组的应用)
http://poj.org/problem?id=2155对于一个n*n(n C x1 y1 x2 y2 ,分别代表矩阵的左上角和右下角,将这个矩阵中的01互换,原为0的变为1,原为1的变为0。Q x y询问A[x,y]现在是几。因为只有01的互换,且原始为0,那么只需计算[x,y]处被换了几次就能确定现在这个格子是几。重点就是怎样快速计算[x,y]格子被换了几次原创 2014-09-26 20:58:39 · 1029 阅读 · 0 评论