
线段树
文章平均质量分 67
jason_star
我要变强!
展开
-
【POJ】3468 (线段树,区间成段按需更新)
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 100100#define ls rt<<1#define rs ls|1#define m (r+l)>>1long long sum[MAX << 2]原创 2015-02-14 16:49:23 · 472 阅读 · 0 评论 -
【CodeForce】 46D Parking Lot (线段树 区间合并)
题目大意:有一条长度为L的街道,有N个操作,操作有两种,(1)"1 a",表示有一辆长度为a的车开进来想找停车位,停车位必须满足与它前面的车距离至少为b,与后面的车距离至少为f.如果能找到这样的停车位,输出这辆车的起始位置(且这个位置最小),否则输出-1。(2)"2 a",表示第a个事件里进来停车的那辆车开出去了思路:需要分4种情况1、没有前面和没有后面,也就是正好这个车的长度等于停车场的原创 2015-03-07 15:38:52 · 468 阅读 · 0 评论 -
【uva】11983 求矩形覆盖k次以上的面积
#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;#define MAX 33000#define ls rt<<1#define rs ls|1#define m ((l+r)>>1)int sum[MAX << 3][12];int col[MAX <<原创 2015-03-20 23:03:44 · 411 阅读 · 0 评论 -
Codeforces Beta Round #35 (Div. 2) E (区间倍增处理区间问题,成段更新,必掌握)
题目大意:给你n个建筑的楼顶的高度,以及楼顶的左坐标l,右坐标r(可以看成是线段),问整个建筑的轮廓的转折点思路:其实这道题涉及到区间的处理。所以需要对区间进行倍增处理,才能在线段树当中达到真正的区间目的。关于转折点的判断方法。首先应该保存一个值y即此时的高度。也就是我们此时要判断的这个x坐标与它上一个x坐标的线段所在的高度。接下来是求出这个x坐标到下一个坐标的线段所在的高度tem原创 2015-03-09 22:45:16 · 445 阅读 · 0 评论 -
【HDU 3642 求长方体的体积并
思路:很简单就不赘述了,更新父节点的函数注意一下就OK#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;#define MAX 3005#define ls rt<<1#define rs ls|1#define m (l+r)>>1int sum1[MAX原创 2015-03-17 21:31:02 · 578 阅读 · 0 评论 -
【ZOJ】1610 Count the Colors(线段树查找隔断的线段)
题目大意:有一条最长8000的线段,其中会被最多8000种颜色分割,问一整段是全部颜色的算1,这样每种颜色有多少段呢?这道题目一开始的思路线段树存放的自然是每一段的情况,设定-1,假如不是-1的话,就表示该段颜色都是相同的,是-1的话,表示下面颜色可以继续分。只是在查找的时候自己犯难了,想不到怎么去将所有颜色的次数查找出来。看了题解,这边用的想法是这样的,通过线段树的query功能,每原创 2015-03-12 21:41:03 · 489 阅读 · 0 评论 -
【Best Coder】#35 DZY Loves Topological Sorting(线段树维护)
题目思路:题目要求点数最大的优先输出。由于可以将k条边去掉。所以这边的一个基本思想就是。面对这次的输出。我们应该选择一个点数最大的,并且他的入度并且注意是每次。每次都得重新选择。下面这组数组就会让你懂得5 3 24 5 3 51 5答案应该是 4 5 3 2 1所以这边需要实时更新每个点的入度,并且每次选择最大的那个入度小于k的那个点,正好利用线段树的维护和查询原创 2015-03-29 23:00:05 · 609 阅读 · 0 评论 -
【FZU】2184 逆序数还原(线段树)
题目思路:这道题目其实跟插队那题线段树是一样的。直接遍历就可以了 #include #include #include #include using namespace std;#define MAX 200005 #define ls rt<<1 #define rs ls|1 #define m ((l+r)>>1) int sum[MAX <<原创 2015-03-22 16:24:00 · 864 阅读 · 0 评论 -
【HDU】4417 Super Mario(划分树+二分)
#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;#define MAX 100050#define m (l+r)>>1int tree[30][MAX];int toleft[30][MAX];int sorted[MAX];int n, k;void b原创 2015-03-30 23:14:21 · 466 阅读 · 0 评论 -
【HDU】2665 求第k小的数
#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;#define MAX 100011#define ls rt<<1#define rs ls|1#define m (l+r)>>1int tree[30][MAX];int sorted[MAX];int原创 2015-03-30 23:17:25 · 549 阅读 · 0 评论 -
【HDU】4027 Can you answer these queries? (线段树)
题目大意:对区间的数开方,并向下取整。题目有一个坑点,会出现左边大于右边,然后需要交换左右,而不是不处理。坑!#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#includeusing namespace std;#define MAX 100005#define ls rt<<1#define r原创 2015-03-14 16:21:29 · 590 阅读 · 0 评论 -
【BC】5192 Building Blocks Ⅱ(思维题+树状数组维护)
题目思路:首先得明白的是假设高度为h的时候,我们求取最少步数的方法是:max(∑(Hi−h),∑(h−Hj))(Hi>h,Hj≤h)其中可以等价于max(∑Hi−cnt(i)∗h,cnt(j)∗h−∑Hj)用语言表达的意思就是H1(高于h的所有积木的高度相加之和)-cnt1(高于h的所有积木的堆数)*h与H1(低于h的所有积木的高度相加之和)-cnt1(低于h的所有积木的堆原创 2015-03-23 20:21:50 · 552 阅读 · 0 评论 -
【POJ】2482 矩形相交面积的变形体(重要)
题目大意:有若干个星星,给了坐标,和星星的亮度,然后给你一个大小固定的长方形,要你求出将这个长方形放咋哪个位置,长方形内星星的总亮度最大。#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;#define MAX 20005#define ls rt<<1#defi原创 2015-03-18 00:06:30 · 512 阅读 · 0 评论 -
HDU 3473 Minimum Sum (划分树)
思路:这道题目可以说,只有你真正理解了划分树之后,你才会想到如何去做.首先这道题的数学思路是很容易想的.要使得数学式子的和最大,很明显.这个x是这个区间按从小到大排列之后最中间的数.所以最后的答案应该是中位数右边的和减去左边的和然后假如这个区间的数的个数为偶数个的话,还需减去一个中位数.所以这道题除了要记录划分树之外,还用sum[20][MAX]来记录前缀和.写划分树实在是要细原创 2015-03-31 21:22:15 · 406 阅读 · 0 评论 -
【CoderForces】#296 Div2 C(线段树+set)
/*这边可以用线段树的原因在于,在水平方向上的最大值,与竖直方向上的最大值是相对应的,也就是说我们只需要求出了水平和竖直方向的最大值,然后相乘就可以了,一开始一直没想通这个,以为是不是对应的,那样的话就没法求了。线段树思路:两个线段树分别计算出水平方向和竖直方向的最大值,最后相乘就可以了。这么就涉及到区间的计算,所以需要两个数组来存水平方向和竖直方向的分割线。最后更新就可以了。也可以用其原创 2015-03-18 19:28:00 · 389 阅读 · 0 评论 -
HYSBZ 2243 染色(树链剖分)
思路:单点的树链剖分题目.大致的思路与边问题的树链剖分大同小异.只是在处理相邻的颜色的计算的时候需要仔细.wa了几发.这边就写一下我处理的思路以及记得起来的wa点.理解树链剖分之后,你会明白,树链剖分是按照路径两边往中间缩.所以我用cu,cv标记两端的颜色.当需要从u开始搜的时候,我就比对一下该端的上一个边缘颜色是否相同.假如相同的话必然减一.好了,这个可以解决大部分问题.原创 2015-04-02 09:33:25 · 460 阅读 · 0 评论 -
【CodeForces】 19D Points(线段树|单点更新)
题目大意:将一个点加入或者删除,查找一个严格大于点。这边应用到了set容器,自动排序,以及方便的加入和删除。set a;a.insert(x);加入这个元素a.erase(x);删除这个元素*(--a.end())访问最后一个元素*(a.upper_bound(x))查找一个大于x的数sum存的是最大的y其他的就跟单点更新的线段树一样了#define _CRT_原创 2015-03-08 10:50:14 · 467 阅读 · 0 评论 -
【Hdu】1540 Tunnel Warfare(线段树|区间合并)
题目大意:有N个村子排成一条直线,每个村子都连接了它的左右两个村子(除了最左边和最右边的外),有3种操作,(1)"D x",表示将第x个村子摧毁。(2)"Qx",表示查询与第x个村子直接和间接相连的村子有多少个。(3)"R",表示将上一次摧毁的村子复原。这边有一个需要注意的点是村子可以多次被摧毁,但只需要一次便可恢复。思路:这边我只用两个数组lsum,和rsum其中作用分别是表示左原创 2015-03-06 16:43:40 · 471 阅读 · 0 评论 -
【HDU】3966 Aragorn's Story(树链剖分+线段树)
树链剖分的模板题,思路就不说了, 等做了一些题目之后,在写个总结吧。先说一下这道题错误的地方。1、爆栈。看大神的博客才找到解决的方法。说是hdu的oj是window的系统,容易爆栈所以在之前应该要手动扩栈。在代码之前加上:#pragma comment(linker, "/STACK:1024000000,1024000000")就可以了。2、是在路径的缩短中写错了。原创 2015-03-27 15:33:14 · 532 阅读 · 0 评论 -
【poj】2828 Buy Tickets、2182 Lost Cow(线段树-单点更新)
题目大意:人们一个一个的来排队并插队,按人到来的顺序给出每个人插队的位置(插在第几个人后面),并告知每个人的id号,输出最终队伍的情况。 思路:这道题假如你正向去处理的话,会发现,当你确定一个位置的时候,会面临之后还需要将这个位置以及这个位置后面的所有位置下调一个位置,这样在插入上,会有很大的复杂度。 所以遇到这种情况不如从后面开始向前遍历。而且这个时候他所要插入的位置便是他最终的位置,假如这个原创 2015-02-11 15:26:48 · 617 阅读 · 0 评论 -
【POJ】1151 Atlantis(线段树+扫描线+离散化)
题目大意:给若干个矩形,每次给的是矩形对角两个点的坐标,求所有矩形并起来的面积。 线段树扫描线典型题:#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;#define MAX 220#defin原创 2015-02-22 17:54:07 · 676 阅读 · 0 评论 -
【HDU】1394 Minimum Inversion Number(线段树求逆序数)
题目大意:给一个长度为n的序列(n<=5000),由0~n-1的数字组成。每次把最左边的数挪到最右边形成一个新的序列。那么一共可以形成n个序列。求这n个序列里面最小的逆序数是多少。 AC代码:/*线段树求逆序数思路:线段树求逆序数的方法并没有想象的那么神奇,对于求单个a的逆序数的方法则是在a到max当中寻找已经出现过的数,出现的个数便是该数的逆序数只是这边将个数通过线段树优化了,使得求解更为原创 2015-02-11 19:26:22 · 574 阅读 · 0 评论 -
【POJ】3321 Apple Tree(DFS树的应用)
题目大意:这边给一棵苹果树,每个节点可以生出多个分支,每个分支可以有0或者1个苹果 现在给出每个节点与分支的情况。以及相应的操作。 思路: 一开始确实是看懵了,想不到为什么是线段树或者是树状数组,这边给的是一棵树,而线段树或者树状数组都是一维数组,所以这边就涉及到一个将树转换成一维数组的方法,便是对树进行dfs。详细看代码吧,初学也不知道怎么表达感悟,等以后加深印象再多写一点内容吧。 线段树原创 2015-02-25 17:34:42 · 636 阅读 · 0 评论 -
【HDU】 2795 Billboard(线段树)
sum表示的是区间的剩余容纳长度#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define MAX 200005#define ls rt<<1#define rs rt<<1|1#define mid (l+r)>>1原创 2015-02-11 21:36:07 · 555 阅读 · 0 评论 -
【POJ】1171 求矩形并的周长(线段树+扫描线+离散化)
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>using namespace std;#define MAX 10010#define ls rt<<1#define rs ls|1#define原创 2015-02-23 20:07:31 · 803 阅读 · 0 评论 -
【CodeForces】343D Water tree (线段树好题!还未弄懂)
/*此题的方法除了用线段树求子树,通过标记父亲,更新儿子的方法,来更新祖先,学习了。对于建树的方法由于并没有说明父亲与儿子的顺序,所以需要通过两次添加。并且pre变量可以获得父亲的位置,还未弄懂!*/#define _CRT_SECURE_NO_WARNINGS#include<cstring>#include<cstdio>#include<iostream>#include<al原创 2015-02-26 22:24:18 · 1208 阅读 · 0 评论 -
【福建省赛】Bilibili(线段树 单点更新,成段查询)
思路:线段树,sum存放的是这个区间每一行可用的最小的最终时间,更新的时候把该点更新为每行的长度加弹幕的长度再加出现的时间即可。简单的线段树,省赛当初没学线段树,不会。现在回头一做,1A#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;#define MAX原创 2015-03-15 00:37:39 · 755 阅读 · 0 评论 -
【Code Forces】221D - Little Elephant and Array(线段树,思维做法)
/*确实,这道题需要明白的一点是在于条件的严格,所以,虽然有十万个数,但满足的数最多就450个,在一组数据当中。所以才采用的方法便是先将数离散化,为了存入结构体数组,这样是为了将个数对应起来,所采用的是map判重以及存储结构体的数组下标。接下来是遍历结构体数组,找出符合条件的数,条件是该数小于他的个数,这样才有机会满足。之后只需要遍历这些数在数组中从1开始到某个位置出现的个数即可。最后做原创 2015-03-01 14:35:32 · 586 阅读 · 0 评论 -
【HDU】1225 覆盖的面积(线段树 扫描线)
思路:做到这一题的时候才真正的理解了上一题矩形并面积的思路col[rt]表示这个区间被覆盖了几次,sum[rt]表示这个区间有效的长度。这边需要引入第三个变量sum2[rt]表示这个区间内被覆盖两次以上的有效部分大小,sum[rt]就变成了覆盖一次的长度。这边需要思考的便是uprt函数,即更新父节点的函数。col[rt]假如不等于0,则表示的就是有一个矩形刚好等于或者包含这段区原创 2015-03-15 18:52:05 · 383 阅读 · 0 评论 -
【POJ】 3667 hotel (线段树-区间合并)
/*sum[rt]表示这个区间内最大的连续区间长度lsum[rt]表示这个区间左边缘最大的连续区间长度,rsum同理。然后对于一个端点的意义,表示的是到下一个端点间的这个长度是否被占用剩下的就是一般的线段树方法了*/#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace st原创 2015-03-03 16:30:50 · 415 阅读 · 0 评论 -
【HDU】3308 LCIS (线段树-区间合并)
#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;#define MAX 100010#define ls rt<<1#define rs ls|1#define m (l+r)>>1int sum[MAX << 2];int lsum[MAX << 2];i原创 2015-03-03 20:33:03 · 565 阅读 · 1 评论 -
【Poj】2464 (线段树)
题目:平面上有若干个点,stan过其中某个点划一条垂直x轴的线(可同时过多个点),ollie过stan画的线中的某个点,画一条垂直与y轴的线,这时候将平面分为4个区域,stan的得分为第一象限和第三象限的个数,olle反之。现在题目的要求来了,有点绕:题目要求在stan画下的一条直线之后,ollie可以获得的最高分,stan获得一个分数x,最后x最大的时候,将ollie的分数输出。思路就不原创 2015-03-19 22:48:43 · 541 阅读 · 0 评论 -
【codeforces】#99 E Mushroom Gnomes - 2
题目大意:有n棵树,m个蘑菇,每棵树有坐标a,高度h,向左边倒的概率,向右的概率(概率用0-100表示),向左倒范围[x-h,x)内的蘑菇被破坏,向右倒范围(x,x+h]范围内的蘑菇被破坏。每个蘑菇有坐标b,及它的魔力值z。 问树倒下后,所以蘑菇的魔力值的和的期望。思路:只需要成段更新出每个点不被压到的概率,然后期望计算即可。之前wa了很多次,就错在我对于懒惰标记原创 2015-03-08 18:46:39 · 552 阅读 · 0 评论 -
【HDU】3255 求长方体并的体积
#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;#define MAX 100003#define ls rt<<1#define rs ls|1#define m (l+r)>>1int col[MAX << 2];long long sum2[MAX <<原创 2015-03-17 00:11:19 · 454 阅读 · 0 评论 -
HYSBZ 1036 树的统计Count(树链剖分)
简单题,1A#define _CRT_SECURE_NO_WARNINGS#include#include#include#includeusing namespace std;#define MAX 30030#define ls rt<<1#define rs ls|1#define m (l+r)>>1int sum[MAX << 2], sum2[MAX << 2]原创 2015-04-02 10:54:12 · 476 阅读 · 0 评论