
线段树
ConwayTian
一切再来,为时未晚。
毁掉你人生的,其实是你内心的平庸,是你失去追求卓越的那个瞬间。
展开
-
HDU 1394 Minimum Inversion Number 树状数组/线段树
题意:给定一个数组 a1, a2, a3, ------ an, (是一个0-n-1的排列)。可以将它转换为以下形式。每次将前m个数提取出来放至末尾。a1, a2, ..., an-1, an (where m = 0 - the initial seqence)a2, a3, ..., an, a1 (where m = 1)a3, a4, ..., an, a1, a2 (wher原创 2011-09-01 16:46:13 · 743 阅读 · 0 评论 -
POJ 3264 Balanced Lineup RMQ / 线段树
题意:给出一个队列,找出指定区间的最大值与最小值。题解:RMQ, 注意边界需要理清楚。参考http://www.cnblogs.com/cnjy/archive/2009/08/30/1556566.html RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次原创 2011-08-13 09:55:27 · 534 阅读 · 0 评论 -
POJ 2750 Potted Flower 线段树+DP
题意:给定一个环形的序列,值可正可负,求最大的连续子序列。(每次更新都需要输出结果,最多包含N-1个点)。#include using namespace std;#define N 100005int pot[N];struct item{ int sum; int lmax,lmin; int rmax,rmin; int sub原创 2011-08-08 00:03:04 · 591 阅读 · 0 评论 -
POJ 2528 Mayor's posters 线段树+离散化
题意: 在墙壁上贴海报,计算出看得见的张数。题解: 线段树基础知识从简单说起,线段树其实可以理解成一种特殊的二叉树。但是这种二叉树较为平衡,和静态二叉树一样,都是提前已经建立好的树形结构。针对性强,所以效率要高。这里又想到了一句题外话:动态和静态的差别。动态结构较为灵活,但是速度较慢;静态结构节省内存,速度较快。接着回到线段树上来,线段树是建立在线段的基础上,每原创 2011-08-06 20:04:56 · 2026 阅读 · 1 评论 -
HDU 4027 Can you answer these queries 线段树
题意:在一场战役中,敌方有一排编号为1至n的战舰。你的指挥官有两种命令: 1.下令使用秘密武器攻击敌方战舰,每次攻击使得敌方一定范围的所有战舰的耐久度降低至原来的平方根(若平方根不为整数,那么舍去后面的小数部分)。2.询问敌方一定范围内的所有战舰的耐久度之和。题解:网赛卡在这道题上了。泪流满面呀。稍不注意就TL, 超时的代码也贴出来,吸取教训···。640ms,把down函数内联可以到50原创 2011-09-12 10:48:58 · 947 阅读 · 0 评论 -
POJ 2182 Lost Cows 线段树
题意: 将N头进行编号,1 -- n。现在所有的牛随机站成一条队列, 我们仅仅知道第 i 个位置的牛前面,有 j 头牛的编号比它的小。要求每个位置的牛的编号。输入的第一行是一个整数N, 接着有N-1行输入,每一行一个整数。假设第5行的数字为3,则表示第5个位置的的牛前面有3头牛的编号比它小。(因为第一个位置的牛的前面比它编号小的肯定没有,故第一个位置的输入被忽略了,所以输入N之后只输入了N-1原创 2011-09-05 15:05:22 · 586 阅读 · 0 评论 -
HUD 1828 Picture 矩形周长/线段树
题意:求重叠矩形的周长。题解:枚举x区间时要注意求出, y 轴投影的线段数量。 即对应一个 x 有多少段不连续的线段,因为这关系的矩形的宽。 对 x 进行排列要记得入边在前,出边在后,否则边相交的两个矩形,就会把重边也计算在内。#include #include #include using namespace std;#define L(x) ( x <<原创 2011-08-22 23:03:48 · 877 阅读 · 0 评论 -
POJ 2777 Count Color 线段树
题意:对长木板进行涂色,有两种操作, 一种插入,一种统计,输出一定范围内的颜色种数。#include#include#includeusing namespace std;#define L(u) (u<<1)#define R(u) (u<<1|1)#define N 150000struct TreeNode { int l,r,c;};TreeNode n原创 2011-08-07 13:28:33 · 634 阅读 · 0 评论 -
POJ 1823 Hotel 线段树
题意:旅馆有三种操作:1入住,同时给你两个数i,M,其中i表示连续房间的起始房号,M表示房间数量;2退房,同时给你两个数i,M,其中i表示连续房间的起始房号;3查询,要求输出整个旅馆中,房号相连的最大空房间数量。此题和3667颇为相似。#include#includeusing namespace std;#define MAXN 20003#define L(u)原创 2012-07-22 19:32:31 · 871 阅读 · 0 评论 -
归并树 第K大值
/*1.O(n*(logn)^2)2.树的节点node从1开始(方便位运算)3.树的层数h从0开始(节约空间)4.数组a的下标从1开始5.我们在queryVal中二分的是[1,n]整个区间,而不是[l,r]区间,这似乎是不正确的。因为假如[l,r]区间中的值为[2,10,22,23],我们要求第3大的值,如果二分到的值是11,他的在[l,r]中的rank为3,这不就错了么?原创 2013-04-03 15:28:14 · 1176 阅读 · 0 评论 -
POJ 2104 K-th Number 划分树
题意:求区间[l,r]中第k小的数题解:#include#include#include#includeusing namespace std;#define MAXN 100001#define L(u) (u<<1)#define R(u) (u<<1|1)#define MID(l, r) ((l+r)>>1)struct SegTree{ int l原创 2012-10-14 13:55:00 · 1207 阅读 · 0 评论 -
线段树模板(lazy标记)ZOJ 3686
题解:先搜索用将树上的点给定时间戳,以此当做该节点的区间。#include #include#includeusing namespace std;#define N 150005bool vis[N], check[N];int dep, k, n;struct treeNode{ int id; treeNode *brother; treeNode *son;原创 2013-04-03 23:25:22 · 1574 阅读 · 0 评论 -
HDU 4288 Coder 离线线段树部分更新
题意:下标模5等于3的数的和。题解:可以这样,线段树的每个节点存一个数组 sum[5],表示当前节点覆盖的区间中,从左到有编号,模 5 为 0,1,2,3,4的所有数的和每个节点再保存一个当前节点所包含的区间中有多少个数的信息:cnt。那么: 添加的时候就是在相应的位置把整数加进去,并把 cnt+1 删除的时候就是在相应的位置赋值原创 2013-05-19 00:52:16 · 940 阅读 · 0 评论 -
HDU 3974 Assign the task 线段树(树映射到区间)
题意....题解:#include#include#include#includeusing namespace std;#define MAXN 100001#define L(u) (u<<1)#define R(u) (u<<1|1)struct A_NODE{ A_NODE *sun, *bro; int num;} anode[MAXN],原创 2013-05-18 22:24:14 · 966 阅读 · 0 评论 -
HDU 1754 I Hate It 线段树
题意:本题目包含多组测试,请处理到文件结束。在每个测试的第一行,有两个正整数 N 和 M ( 0学生ID编号分别从1编到N。第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,原创 2011-08-15 20:50:41 · 591 阅读 · 0 评论 -
HDU 1698 Just a Hook 线段树
题意:一条长链子上面有许多钩子,一次编号 1 - n ,每个钩子有金银铜三种材质(3,2,1),假设一开始全是铜质的,每次操作可以将 x - y 范围内的钩子变成 z 材质.求最后整条链子的值。题解:lazy标记#include #include using namespace std;#define L(u) ( u << 1 )#define R(u) ( u <<原创 2011-09-01 10:45:56 · 761 阅读 · 0 评论 -
HDU 1166 敌兵布阵 线段树
题意:敌兵阵地上有编号 1 - n 的营地, 每个营地的人员会增加或者减少。题中有四种操作。(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);(3)Query i j ,i和j为正整数,i题解:#include #include using namespace s原创 2011-09-01 10:07:11 · 544 阅读 · 0 评论 -
POJ 2482 Stars in Your Window 线段树
题意:每一颗星星有一定的亮度值,现在坐标系中有许多星星,每个星星的坐标及亮度值已经给定,求一个矩形能够框住的最大值。Lazy 标记。题解:对每一颗星星,画出以它为左下角的矩形,这个矩形就是它的影响范围。为了方便处理,我们将每一颗星分作两颗,frist_star ( x, y, val ), second_star ( x + w, y, -val ),这样当我们不断插入星星的时候,其原创 2011-08-14 23:07:50 · 1089 阅读 · 0 评论 -
POJ 1151 Atlantis 线段树/矩形面积并
题意:求矩形的面积并。题解:求矩形的并,由于矩形的位置可以多变,因此矩形的面积一下子不好求这个时候,可以采用“分割”的思想,即把整块的矩形面积分割成几个小矩形的面积,然后求和就行了这里我们可以这样做,把每个矩形投影到 y 坐标轴上来然后我们可以枚举矩形的 x 坐标,然后检测当前相邻 x 坐标上 y 方向的合法长度,两种相乘就是面积 然后关键就原创 2011-08-21 21:52:01 · 2131 阅读 · 0 评论 -
POJ 3225 Help with Intervals 线段树
题意:给出一个区间 0 - 65535。五种操作:OperationNotationDefinitionUnionA ∪ B{x : x ∈ A or x ∈ B}IntersectionA ∩ B{x : x ∈ A and x ∈ B}Relative complementationA − B{x :原创 2011-09-16 22:41:41 · 867 阅读 · 0 评论 -
HDU 4006 The kth great number 堆/优先级队列/线段树
题意:先输入两个整数 n, k。然后有 n 行输入, I 代表写下一个数字, Q代表询问在所有写下的数字中第 k 大的数数多少?题解:因为当写下的数少于 k 个是不存在询问的情况。所以可以建一个堆,然后没写下一个数字,若它比堆中的最小数字还小,则堆不做改变。若它比堆中的最小数字要大,那么将堆中的最小数字去掉,并加入刚写入的数字。具体写了三种方法:方法一:最小堆#include原创 2011-09-05 16:48:53 · 914 阅读 · 0 评论 -
HDU 4007 Dave 线段树
题意:广场上有许多的人,现在给你一个边长为R的正方形,求正方形最多能框住的人,包括边界。题解:#include #include using namespace std; #define N 2010 #define L(u) ( u * 2 ) #define R(u) ( u * 2 + 1 ) #define max(a,b) (原创 2011-09-05 15:24:27 · 906 阅读 · 0 评论 -
POJ 3667 Hotel 线段树
题意: 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以明媚的阳光。作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿。这个巨大的旅馆一共有N (1 湖面。贝茜一行,以及其他慕名而来的旅游者,都是一批批地来到旅馆的服务台,希望能订到D_i (1 <= D_i <= N)间连续的房间。服务台的接待工作也很简单:果存在r满足编号为r..r+D_i-1的房间均空着,他就原创 2011-09-02 10:00:02 · 676 阅读 · 0 评论 -
POJ 2029 Get Many Persimmon Trees DP/二维树状数组/线段树
题意:给定一个由坐标系构成的柿子树林,有的坐标点上存在柿子树,有的不存在。现在准备送给你一块土地,土地的长和宽已经确定,怎么选才能使给你的土地上的柿子树最多。题解:这道题和 2482 Stars in Your Window 颇为相似。下面给出了三种解法。方法一:DP#include using namespace std;#define N 103int原创 2011-08-30 20:37:19 · 680 阅读 · 0 评论 -
HDU 1255 覆盖的面积 线段树
题意:给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.题解:和 poj1151 类似,不过要求的是面积的交,同样是先离散化然后枚举x坐标。此题更新时求y方向的“合法长度”相对于 poj1151 还有些区别, 值得比较比较。并且用lazy貌似也不合适,必须跟新至单元,因为每个节点既受父节点影响,也受子节点影响。len[1]是覆盖一次的长度,len[2]是覆盖次数>= 2的长原创 2011-08-22 13:04:05 · 1527 阅读 · 0 评论 -
HDU 1823 Luck and Love 二维线段树 / 矩形树
题意:本题有多个测试数据,第一个数字M,表示接下来有连续的M个操作,当M=0时处理中止。接下来是一个操作符C。当操作符为‘I’时,表示有一个MM报名,后面接着一个整数,H表示身高,两个浮点数,A表示活泼度,L表示缘分值。 (100题解:注意浮点数的处理,一般来说可以离散化,或者化作整数处理。二维线段树,第一维度的每一个节点都包含第二维度的一颗线段树。这种方式对于更高的维度就不是原创 2011-08-16 18:01:21 · 1446 阅读 · 1 评论 -
POJ 3368 Frequent values RMQ / 线段树
题意;给定一个升序的数列(1-100000), 比如 array[10] = -1 -1 1 1 1 1 3 10 10 10, 求其中某段区间上相同的数字最多有几个。[ 2, 3 ] = 1, [ 1, 10 ] = 4, [ 5, 10 ] = 3。(下标从1开始)。题解:先将连续相等的几个数合并为一个部分(part), 或者说一个点。每点包括了起始位置,终止位置,原创 2011-08-13 16:21:55 · 645 阅读 · 0 评论 -
POJ 2828 Buy Tickets 线段树
题意:买火车票时总有人插队,每人有两个属性,插入位置pos[i] (pos[i]代表此人前面的总人数),以及人物编号 value[i]。在每一轮输入后,按队伍顺序输出人物的编号。题解:处理点的线段树。从后往前推,则可以避免后来人对pos的影响,这样一来每个人的pos都是精确的。 #include using namespace std;#define MAX 200005原创 2011-08-07 16:32:37 · 635 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers 线段树
题意:给出一串数列,有两种操作。Q ( x, y ) 表示输出数列的第 x -- y 个元素的和。 C(x,y,z) 表示将 x - y 的所有元素均加上 z。题解:线段树很容易。但是听说这题可以用树状数组解,在网上搜了下,暂且把地址记下来。树状数组http://kenby.iteye.com/blog/962159#include using namespace std;原创 2011-09-01 20:21:40 · 533 阅读 · 0 评论 -
划分树模板
#include#include#include#includeusing namespace std;#define MAXN 100001#define L(u) (u<<1)#define R(u) (u<<1|1)#define MID(l, r) ((l+r)>>1)struct SegTree{ int l, r;} node[MAXN*4];in原创 2013-05-11 20:22:47 · 779 阅读 · 0 评论