
数据结构-线段树
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
hdu 5592 ZYB's Premutation(线段树)
题目链接:hdu 5592 ZYB’s Premutation代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 50005;#define lson(x) ((x)<<1)#define rson(x) (((x)<<1)|1)int lc[maxn<<原创 2015-12-26 22:18:35 · 838 阅读 · 0 评论 -
hdu 1542 Atlantis(扫描线)
题目链接:hdu 1542 Atlantis题目大意:N个矩形,求矩形面积的并。解题思路:线段树扫描线的裸题。#include #include #include #include using namespace std;const int maxn = 1005;#define lson(x) ((x)#define rson(x) (((x)int l原创 2014-10-03 10:47:40 · 572 阅读 · 0 评论 -
hdu 5107 K-short Problem(线段树)
题目链接:hdu 5107 K-short Problem题目大意:有N个点,M次询问,每次询问点X,Y,K,表示在点集合{(x,y)|x≤X,y≤Y}中高度第K小的值是多少,没有的话输出-1。解题思路:线段树,每个节点维护10个高度(因为K最大为10),将询问和点按照x,y的大小排序,从左向右,从下向上,每次询问就查询[0,idx(y)]即可。注意如果询问和点的位原创 2014-11-16 11:22:59 · 1340 阅读 · 0 评论 -
hdu 3340 Rain in ACStar(线段树+几何)
题目链接:hdu 3340 Rain in ACStar题目大意:给定N个多边形,然后每次查询一段坐标内图形的面积。解题思路:很棒的一题,结合了几何的知识和线段树维护等差数列。这篇题解写的很详细连接#include #include #include #include #include #include using namespace std;const原创 2014-10-14 00:11:28 · 819 阅读 · 0 评论 -
hdu 1828 Picture(线段树)
题目链接:hdu 1828 Picture题目大意:N个矩形,求矩形周长的并。解题思路:利用到线段数区间合并,记录有多少个连续块,还用到区间修改,每次对于一条边,除了要计算竖直方向,还要计算水平方向,而水平方向是修改后的增减量。#include #include #include #include #include using namespace std;con原创 2014-10-03 10:49:21 · 972 阅读 · 0 评论 -
hdu 1540 Tunnel Warfare(线段树)
题目链接:hdu 1540 Tunnel Warfare题目大意:有连续的N个城镇,三种操作:D x:第x城镇被破坏Q x:插叙第x城镇所在联通块有多少个城镇没有被破坏R:修复最后一个被破坏的城镇解题思路:线段树区间合并,每个城镇看成一个叶子节点,用一个vector记录破坏顺序。对于查询来说,每次只要判断是否在mid−R[lson(u)],mid+L[rson(u)]之间即原创 2014-10-03 10:43:54 · 1308 阅读 · 0 评论 -
Codeforces 46D Parking Lot(线段树)
题目链接:Codeforces 46D Parking Lot题目大意:一个街道,长为N,每辆车停进来的时候必须和前面间隔B米,和后面间隔F米,现在用两种操作,1是停进来一个长为x的车,2是第x辆车开走。解题思路:区间合并,建一颗长度为N + B + F的线段树,然后每次停车进去的时候都查询x + B + F的区间,然后修改的时候只修改x的长度。#include #inclu原创 2014-10-03 10:38:23 · 980 阅读 · 0 评论 -
uva 12436 - Rip Van Winkle's Code(线段树)
题目链接:uva 12436 12436 - Rip Van Winkle's Code题目大意:四种操作,操作见题目。解题思路:即用线段树维护一个等差数列,因为一个等差加上一个等差还是一个等差数列,所以对于每个节点记录区间左端的值,也就是首项,以及公差即可。因为还有一个S操作,所以要开一个标记记录区间值是否相同。#include #include #inclu原创 2014-10-14 00:03:23 · 2455 阅读 · 0 评论 -
hdu 4027 Can you answer these queries?(线段树)
题目大意:hdu 4027 Can you answer these queries?题目大意:给定一个长度为N的序列,Q次操作,0 l r:将区间l r之间的数开根;1 l r:查询l r之间数的和。解题思路:这题看上去是一道线段树,其实它就是一道线段树,只不过不用想的太复杂,因为开根的趋近1的速度非常快,所以每个节点只要标记区间内元素是否相同即可。复杂度妥妥的。#inclu原创 2014-10-12 08:38:42 · 1139 阅读 · 0 评论 -
hdu 3954 Level up(线段树)
题目链接:hdu 3954 Level up题目大意:N个英雄,M个等级,初始等级为1,给定每个等级需要的经验值,Q次操作,操作分两种,W l r x:表示l~r之间的英雄每个人杀了x个怪物;Q l r:表示询问l~r之间经验值最大的英雄经验值为多少。每轮杀怪,每只怪物的经验和当前等级成正比。解题思路:线段树维护,每个节点维护最大值,区间内还需要杀多少怪就能升级的最小值,如果这个最原创 2014-10-12 08:32:21 · 1227 阅读 · 0 评论 -
hdu 3255 Farming(扫描线)
题目链接:hdu 3255 Farming题目大意:给定N个矩形,M个植物,然后给定每个植物的权值pi,pi表示种植物i的土地,单位面积可以收获pi,每个矩形给定左下角和右上角点的坐标,以及s,s表示该矩形可以中植物s。问说总的最大收益。解题思路:因为一块只能种一种植物,所以对于一块重叠的土地,要选取收益最大的植物种植。除去这一点,剩下的就是线段树扫描线的应用了。那对于pi可以视为原创 2014-10-11 16:29:42 · 1067 阅读 · 0 评论 -
hdu 3016 Man Down(线段树)
题目链接:hdu 3016 Man Down题目大意:有N个板,每个板有高度,以及l,r,d,l和r表示所在区间,d表示跳到该板上后将获得的能量(可能为负),保证没有两个板的高度相同。人的初始位置为最高的板上,能量值为100,如果能量值为0则game over,每次可以从左边或者右边跳下去,每次跳越属于垂直下落,落到最近的板上。求移动到地面上后的最大能量值,地面高度为0并且长度视为无穷大。原创 2014-10-11 16:18:07 · 1180 阅读 · 0 评论 -
zoj 3511 Cake Robbery(线段树)
题目链接:zoj 3511 Cake Robbery题目大意:就是有一个N边形的蛋糕,切M刀,从中挑选一块边数最多的,保证没有两条边重叠。解题思路:有多少个顶点即为有多少条边,所以直接按照切刀切掉点的个数排序,然后用线段树维护剩下的还有哪些点。#include #include #include #include using namespace std;const原创 2014-10-13 09:46:23 · 1020 阅读 · 0 评论 -
hdu 3874 Necklace(线段树)
题目链接:hdu 3874 Necklace题目大意:和hdu 3333 Turing Tree是一样的。不解释。#include #include #include #include #include using namespace std;typedef long long ll;const int maxn = 50000;int N, Q;ll A[m原创 2014-10-11 17:26:54 · 627 阅读 · 0 评论 -
Codeforces 85D Sum of Medians(线段树)
题目链接:Codeforces 85D - Sum of Medians题目大意:N个操作,add x:向集合中添加x;del x:删除集合中的x;sum:将集合排序后,将集合中所有下标i % 5 = 3的元素累加求和。解题思路:线段树单点更新,每个点维护5个值,分别表示从该段区间中i % 5 = t的和。然后两端区间合并时只需要根据左孩子中元素的个数合并。所以有一个c表示区间上元原创 2014-10-11 17:08:25 · 1835 阅读 · 0 评论 -
poj 2482 Stars in Your Window(扫描线)
题目链接:poj 2482 Stars in Your Window题目大意:平面上有N个星星,问一个W∗H的矩形最多能括进多少个星星。解题思路:扫描线的变形。只要以每个点为左上角,建立矩形,这个矩形即为框框左下角放的位置可以括到该点,那么N个星星就有N个矩形,扫描线处理哪些位置覆盖次数最多。#include #include #include #include us原创 2014-10-12 08:58:46 · 1074 阅读 · 0 评论 -
hdu 3642 Get The Treasury(扫描线)
题目链接:hdu 3642 Get The Treasury题目大意:三维坐标系,给定若干的长方体,问说有多少位置被覆盖3次以上。解题思路:扫描线,将第三维分离出来,就是普通的二维扫描线,然后对于每个节点要维护覆盖0,1,2,3以上这4种的覆盖面积。#include #include #include #include using namespace std;co原创 2014-10-12 08:22:26 · 1037 阅读 · 0 评论 -
hdu 3333 Turing Tree(线段树)
题目链接:hdu 3333 Turing Tree题目大意:给定一个长度为N的序列,有M次查询,每次查询l,r之间元素的总和,相同元素只算一次。解题思路:涨姿势了,线段树的一种题型,离线操作,将查询按照右区间排序,每次考虑一个询问,将mv ~ r的点全部标记为存在,并且对于每个位置i,如果A[i]在前面已经出现过了,那么将前面的那个位置减掉A[i],当前位置添加A[i],这样做维护原创 2014-10-11 16:47:48 · 1636 阅读 · 0 评论 -
hdu 2689 Sort it(线段树)
题目链接:hdu 2689 Sort it题目大意:求逆序对数。解题思路:用水水的线段树做了一下。#include #include #include using namespace std;const int maxn = 1005;#define lson(x) ((x)#define rson(x) (((x)int lc[maxn 2], rc[ma原创 2014-10-23 19:29:54 · 650 阅读 · 0 评论 -
ural 1707. Hypnotoad's Secret(线段树)
题目链接:ural 1707. Hypnotoad's Secret题目大意:给定N和M,然后N组s0, t0, Δs, Δt, k,每组可以计算出k个星星的坐标;M组a0, b0, c0, d0, Δa, Δb, Δc, Δd, q,每组要求算出q个矩形,判断矩形内是否包含星星,对于q≥20的情况要根据公式计算一个值即可。解题思路:计算出所有的星星坐标和矩阵,这个每的说了原创 2014-10-14 00:06:40 · 1463 阅读 · 2 评论 -
hdu 4630 No Pain No Game(线段树)
题目链接:hdu 4630 No Pain No Game解题思路P[x]表示因子x最近出现的为值,在考虑位置i时,如果有因子x,则P[x]~i之间即可以有因子x,用线段树维护区间最大值。然后将查询离线。代码#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;#d原创 2015-10-26 21:57:14 · 589 阅读 · 0 评论 -
hdu 4614 Vases and Flowers(线段树)
题目链接:hdu 4614 Vases and Flowers解题思路用线段树维护空位。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define lson(x) (x<<1)#define rson(x) ((x<<1)|1)const int maxn = 50005;int原创 2015-10-26 21:39:35 · 577 阅读 · 0 评论 -
hdu 5412 CRB and Queries(线段树套笛卡尔树 - 动态区间第k大)
题目链接:hdu 5412 CRB and Queries首先对所有出现过的值排序,建立线段树,每个线段树的节点是一棵笛卡尔树,笛卡尔树记录区间下标值。#include #include #include #include using namespace std;#define lson(x) (x<<1)#define rson(x) ((x<<1)|1)原创 2015-08-21 22:32:54 · 1281 阅读 · 0 评论 -
zoj 3911 Prime Query(线段树)
题目链接:zoj 3911 Prime Query代码#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int maxn = 1e6 + 5;const int maxm = 1e7;#define lson(x) ((x)<<1)#defin原创 2015-10-22 19:11:59 · 588 阅读 · 0 评论 -
hdu 4666 Hyperspace(线段树)
题目链接:hdu 4666 Hyperspace解题思路线段树单点修改,区间查询。做2k2^k维护ans数组即可。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define lson(x) ((x)<<1)#define rson(x) (((x)<<1)|1)const int原创 2015-11-06 21:41:19 · 635 阅读 · 0 评论 -
hdu 5489 Removed Interval(线段树+LIS)
题目链接:hdu 5489 Removed Interval解题思路正序一遍LIS,逆序一遍LIS。在正序的时候维护一棵线段树,逆序做的时候可以查询当前位置向前间隔L之后,并且终止val小于当前位置的LIS。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn =原创 2015-10-01 21:44:41 · 1116 阅读 · 0 评论 -
hdu 5493 Queue(线段树)
题目链接:hdu 5493 Queue解题思路将人头按照从小到大排序,每次优先放小的,尽量靠前。 用线段树维护空位,每次判断前隔k人靠前还是后隔k人靠前。代码#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 100005;原创 2015-10-01 21:59:11 · 715 阅读 · 0 评论 -
hdu 5475 An easy problem(线段树)
题目链接:hdu 5475 An easy problem解题思路单点修改。貌似直接暴力都可以过,数据很弱。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e5 + 5;#define lson(x) ((x)<<1)#define rson(x)原创 2015-09-30 16:30:58 · 904 阅读 · 0 评论 -
hdu 5458 Stability(树链剖分+强连通缩点+线段树)
题目链接:hdu 5458 Stability解题思路先将操作处理一遍,获得最终图,然后对图进行双联通缩点,剩下的肯定是一棵树,然后将操作逆着做一遍,遇到删边等于是加一条边,加的这条边u,v等于是将两节点路径上的点联通起来变成一个新的双联通分量,在同一个双联通分量中,明显ans=0。所以我们用线段树维护树的每条边权,一开始全为1,每次添加一条边,就将这条路径上的边权值置为0。代码#include <原创 2015-09-29 20:45:48 · 976 阅读 · 0 评论 -
hdu 5454 Excited Database(线段树)
题目链接:hdu 5454 Excited Database解题思路维护两科线段树,一棵i+j,一棵i-j。因为对角线上的值一定都是相同的,只是查询时的个数不一样,但是根据区间范围可以计算出来每条对角线的个数。每个树维护单一节点权值和s,从右边递增的和r,从左边递增的和l。查询的时候将矩形分成3份。代码#include <cstdio>#include <cstring>#include <al原创 2015-09-29 20:26:22 · 1046 阅读 · 0 评论 -
hdu 5381 The sum of gcd(线段树+gcd)
题目链接:hdu 5381 The sum of gcd将查询离线处理,按照r排序,然后从左向右处理每个A[i],碰到查询时处理。用线段树维护,每个节点表示从[l,i]中以l为起始的区间gcd总和。所以每次修改时需要处理[1,i-1]与i的gcd值,但是因为gcd值是递减的,成log级,对于每个gcd值记录其区间即可。然后用线段树段修改,但是是修改一个等差数列。#inclu原创 2015-08-15 11:45:22 · 1864 阅读 · 0 评论 -
hdu 5316 Magician(线段树)
题目链接:hdu 5316 Magician线段树,区间合并,每个节点维护两端位置分别为奇奇,奇偶,偶奇,偶偶的beautiful 子串,合并的时候注意不能为空即可。#include #include #include using namespace std;typedef long long ll;const int maxn = 100005;const原创 2015-07-28 20:50:06 · 631 阅读 · 0 评论 -
hdu 5306 Gorgeous Sequence(线段树)
题目链接:hdu 5306 Gorgeous Sequence和普通的线段树一样一个标记值T,然后另外加一个C值记录以u为根节点的子树下有多少个叶子节点被T值控制。每次修改时,dfs到叶子节点之后在修改该节点。维护sum值时只要额外加上T值控制下的节点。加了个输入外挂,时间少了将近1000ms。#include #include #include using nam原创 2015-08-07 18:59:25 · 2010 阅读 · 0 评论 -
Codeforces 484E Sign on Fence(可持久化线段树+二分)
题目链接:Codeforces 484E Sign on Fence题目大意:给定给一个序列,每个位置有一个值,表示高度,现在有若干查询,每次查询l,r,w,表示在区间l,r中,连续最长长度大于w的最大高度为多少。解题思路:可持久化线段树维护区间合并,前端时间碰到一题可持久化字典树,就去查了一下相关论文,大概知道了是什么东西。将高度按照从大到小的顺序排序原创 2014-11-07 00:31:22 · 2381 阅读 · 0 评论 -
hdu 4897 Little Devil I(树链剖分+线段树)
题目链接:hdu 4897 Little Devil I题目大意:给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作:1 u v:u到v路径上的边都取成相反的颜色2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一个节点在路径上)3 u v:查询u到v路径上有多少个黑色边解题思路:树链剖分,用两个线段W和L维护,W对应的是每条的黑白情况,L表示的是每个原创 2014-10-18 10:31:40 · 2208 阅读 · 0 评论 -
hdu 5029 Relief grain(树链剖分+线段树)
题目链接:hdu 5029 Relief grain题目大意:给定一棵树,然后每次操作在uv路径上为每个节点添加一个数w,最后输出每个节点个数最多的那个数。解题思路:因为是在树的路径上做操作,所以基本就是树链剖分了。只不过以前是用一个数组即可维护值,这题要用一个vector数组记录。过程中用线段树维护最大值。#pragma comment(linker, "原创 2014-10-18 10:27:24 · 1394 阅读 · 1 评论 -
Codeforces 482B Interesting Array(线段树)
题目链接:Codeforces 482B Interesting Array题目大意:给定一个长度为N的数组,现在有M个限制,每个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是否有满足的数列。解题思路:线段树维护,每条限制等于是对l~r之间的数或上q(取且的性质,相应二进制位一定为1),那么处理完所有的限制,在进行查询,查询对应每个l~r之间的数原创 2014-11-03 10:05:01 · 1578 阅读 · 0 评论 -
hdu 3265 Posters(扫描线)
题目链接:hdu 3265 Posters题目大意:就是给定N个矩形,矩形比较特殊,均被减掉了一部分,问说图形最后的覆盖面积。解题思路:一开始做的时候以为直接做扫描线就好了,一个做加的一个做减的,后来写完样例都跑不出来,还是对扫描线理解的不够深刻,因为扫描线没有pushdown的操作,因为它肯定对于每段区间有加有减,那么如果碰到一开始就是减的,就没法做了。正解是将一个图形差分成原创 2014-10-11 16:37:40 · 977 阅读 · 0 评论 -
hdu 2871 Memory Control(线段树)
题目链接:hdu 2871 Memory Control题目大意:模拟一个内存分配机制。Reset:重置,释放所有空间New x:申请内存为x的空间,输出左地址Free x:释放地址x所在的内存块Get x:查询第x个内存块,输出左地址解题思路:一开始全用线段树去做,写的乱七八糟,其实只要用线段树维护可用内存。然后用户一个vector记录所有的内存块。#include原创 2014-10-01 13:27:47 · 1089 阅读 · 0 评论 -
hdu 3397 Sequence operation(线段树)
题目链接:hdu 3397 Sequence operation题目大意:给定一个01序列,5种操作:0 a b:将区间a,b上的数置为01 a b:将区间a,b上的数置为12 a b:将区间a,b上的元素0变1,1变03 a b:查询a,b中1的个数4 a b:查询a,b中最大连续1的个数解题思路:区间合并+成段更新。#include #include #incl原创 2014-10-01 13:14:54 · 668 阅读 · 0 评论