线段树
文章平均质量分 69
qingniaofy
这个作者很懒,什么都没留下…
展开
-
hdu 1394
线段树 求 逆序数。。初始化线段树 为 0 ,对输入的 n 个数据 一次判断 ,假设 输入 x ,则 更新 线段树前 先 询问 区间 x+1 到 n 之间 的 sum 值即 有 多少个 比 x大 的数,然后 更新 x 值 为 1求出 逆序数之后 ,利用 递推可 算出 全排列 的 最小 逆序数 ,举个 例子101 3 6 9 0 8 5 7 4 2 分别求出 比 该 数 大的数原创 2012-07-13 20:52:57 · 645 阅读 · 1 评论 -
hdu 1542 矩形面积并
线段树扫描线。。思路:将每个矩形看成平行于y轴的两条线段,第一条位置 x1,第二条位置 x2,两条线段的端点均为 y1,y2 (注:x1,y1 为矩形左下角坐标,x2,y2为右上角坐标,题目描述错了) ,然后将左边的 线段标记cover=1,右边的线段 标记cover=-1,线段树记录 len 表示 当前该区间可用于与下一线段求并面积的y坐标区间长度。按x坐标排序后从左到右扫描,同时要注意原创 2012-08-08 09:54:44 · 1117 阅读 · 1 评论 -
poj 1177 & hdu 1828 矩形周长并
线段树扫描线。。思路 : 先将数据离散化,然后将 每个矩形看成 两条线段,分别为 左边的垂线段和 右边 垂线段,对所有的线段按 x 坐标进行排序,依次插入到 线段树中。线段树需要记录 的内容 为 len ->当前区间被线段覆盖的长度,cnt->当前区间内 包含的 连续子线段数,lbd,rbd-> 当前区间左边界和右边界,cover->覆盖标记。lbd 和 rbd 是判断 是否两条线段可原创 2012-08-10 01:33:10 · 1018 阅读 · 0 评论 -
poj 3667
题目大意:有一群奶牛去旅店住宿,询问 是否有连续 size个 房间,如果有就住下,当然,每一次如果有多个符合条件的size,那么我们都要选择左端点最小的那个,如果没有就不住,去别的地方,同时会有其他的操作,即 从 pos开始 size个 房间的客人会 退房思路:线段树 ,节点记录信息为 lsum记录区间左端空白区,rsum记录右端空白区,msum记录区间最大空白区,cover记录标记情况。原创 2012-07-29 09:31:43 · 1693 阅读 · 0 评论 -
hdu 4325
线段树啊,注意离散化,悲催的一题。。#include#includeusing namespace std;#define lson u<<1#define rson u<<1|1const int maxn=100010;int st[maxn],ed[maxn];int q[maxn],dat[maxn<<1];struct Node{ int lef,r原创 2012-07-31 23:42:22 · 1283 阅读 · 0 评论 -
hdu 3308
求最长连续上升子序列,wa了 好多次啊,因为一开始 query的时候没处理好,然后就越想越离谱了,后来直接以为是 最长上升子序列,各种讨论,n次wa之后终于再回想起来。#include#includeusing namespace std;#define lson u<<1#define rson u<<1|1#define MAXN 100010#define Max(a,b,原创 2012-08-01 23:08:07 · 716 阅读 · 0 评论 -
hdu 4391 线段树 优化
2012 多校第十场,这个题目比赛的时候我直接在每个节点里面开了一个map,结果毫无疑问MLE 了,比赛之后看了结题报告说是 分段哈希,没学过,后来听说线段树稍微剪枝一下就能过,换了一下思路,确实就能过了,每个节点也不需要记录每种颜色的个数了,只需要记录最大的编号和最小的就可以了。。#include#includeusing namespace std;#define lson u<<原创 2012-08-25 15:49:41 · 757 阅读 · 0 评论 -
hdu 4262 线段树优化
#include#include#include#includeusing namespace std;#define lson u<<1#define rson u<<1|1#define MAXN 100005int map[MAXN];struct Node{ int lef,rig; int sum;}T[MAXN<<2];void PushUp(int原创 2012-09-06 18:24:28 · 829 阅读 · 0 评论 -
lower_bound and upper_bound 返回
函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置函数upper_bound()返回的在前闭后开区间查找的关键字的上界,如一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,同样,如果插入元素大于数组中全部元素,返回的原创 2012-09-13 21:01:06 · 606 阅读 · 0 评论 -
hdu 4288 2012成都网络赛
线段树学的远远不够啊,网络赛的时候一直不知道怎么做,后来看了大神报告,才学了一下。线段树每个节点 记录 sum[0...5],即位置mod 5 的5种结果的数对应的和。cnt记录区间有多少个数。更新的时候 只要把对应子区间的sum[i]加起来就可以了#include#includeusing namespace std;#define MAXN 100010#de原创 2012-09-16 23:16:12 · 3531 阅读 · 0 评论 -
hdu 4417 2012杭州网络赛
给出 n 个数,m个询问,对于 每个询问 输出[l,r]区间里面 大于 h 的数个数,由于n和m都很大,直接搞肯定不行,可以用线段树求解。线段树 每个区间 保存 与该区间长度一样 对应 的 数据段,然后进行排序,查询的时候 如果该区间包含在 要询问的区间,那么直接二分查上界即可,否则继续向下询问。。#include#includeusing namespace std;#defin原创 2012-09-24 23:52:20 · 1152 阅读 · 0 评论 -
poj 1436
给出 n 条垂线,问有多少个三元组 中,任意两条可以看得到对方样例中 答案为 1 ,横坐标 为 1 的线段+横坐标 为 2 (3,4)的线段+横坐标为 1 的线段 做过 poj 2777 区间染色的问题 就 很容易看出这个 题目 其实就 是 该问题 的小 延伸,我们可以根据x坐标进行从小到大的排序,然后对每条线段query该线段左端,改线段统领的区间内 有多少种color,vis[][原创 2012-07-22 13:29:06 · 2147 阅读 · 1 评论 -
hdu 3397
线段树,经过前面的训练,这题其实就是前面的题目综合起来的,题目也不难,有点麻烦,但是这都不是重点,重点是,我TLE 了n次啊,啊啊啊啊。。一开始 三个数取大,我自己定义了一个 #define Max(a,b,c)((a)>(b)?(a)>(c)?(a):(c):(b)>(c)?(b):(c))but ,就是因为它,我一直tle,俺搞不懂为什么,这个式子俺再去测试一下然后这个题目原创 2012-08-05 16:11:38 · 2228 阅读 · 2 评论 -
poj 2777
区间染色问题,线段树#include#includeusing namespace std;#define lson u<<1#define rson u<<1|1#define MAXN 100010bool visit[55];struct Node{ int lef,rig,color;}T[MAXN<<2];void Build(int u,int l,in原创 2012-07-21 09:35:38 · 607 阅读 · 0 评论 -
hdu 1754
线段树 第二个题目,求 区间 最大值。。//============================================================================// Name : HH.cpp// Author : lxw// Version :// Copyright : Your copyright notic原创 2012-07-13 11:01:22 · 474 阅读 · 0 评论 -
hdu 1166
敌兵布阵最近开始学线段树,这是第一个题目,参考了大神的 解题报告的,一开始真的完全不会。。//============================================================================// Name : HH.cpp// Author : lxw// Version :// Copyrig原创 2012-07-13 10:41:26 · 701 阅读 · 0 评论 -
hdu 2795
题目 : 有一块 h*w 的板,要贴一些 1*wid 的纸条,规则是 每次 贴 的时候要从 上到下,从左到右(贴的下的话)。问每次要贴的纸条是贴在 第几行线段树求解,记录 当前节点的 wid 即最大值,找到最大值的位置,输出,更新 wid的值。。//=======================================================================原创 2012-07-14 00:39:58 · 589 阅读 · 0 评论 -
poj 2886
题目:N 个小孩围成一圈,他们被顺时针编号为 1 到 N。每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的,则是右手边的第 -A 个小孩。游戏将直到所有小孩都离开,在游戏中,第 p 个离开的小孩将得到 F(原创 2012-07-15 20:08:25 · 3581 阅读 · 1 评论 -
poj 2828
排队买票,但是 中途 出现插队情况,比如 0 123,代表值为123的人 插入到 0 的位置,如果后面 出现 0 456,那么新的 0的位置就是 456,123就变成是 1的位置了观察发现,最后一个插入到该位置的人位置是固定的,那么我们可以从后面进行插入操作,pos val 代表val要插入到pos位置,那么就是说 pos 前面要留出 pos个位置,因为 是从 0 开始的。线段树 :r原创 2012-07-15 13:04:35 · 2381 阅读 · 1 评论 -
hdu 1698
线段树成段更新。。采用延迟标记法#include#includeusing namespace std;#define for if(0);else for#define MAXN 100005#define lson u<<1#define rson u<<1|1struct Node{ int lef,rig,sum; int delta;//增加量}T[MAX原创 2012-07-16 22:13:34 · 1068 阅读 · 0 评论 -
poj 3468
线段树区间更新,区间查询。。#include#includeusing namespace std;#define MAXN 100005#define lson u<<1#define rson u<<1|1#define LL __int64struct Node{ int lef,rig; LL sum,delta;//增值}T[MAXN<<2];int da原创 2012-07-16 23:16:29 · 682 阅读 · 0 评论 -
poj 2528
要贴一些海报,由于宽度一样,看成 一些 线段 ,区间分别为 [L,R],按顺序贴海报,会覆盖,要问最后可以看到几张海报。。线段树区间更新是很明显的,但是由于 数据 很大,不能直接搞,需要进行离散化处理所谓离散化,就是 通过 处理将数据 化小,但是 保持 数据之间的大小关系。。如 10 11 12 13 ===> 1 2 3 4这个题目需要注意一点,就是 不能直接离散化,否则会原创 2012-07-17 21:19:36 · 633 阅读 · 0 评论 -
hdu 4339
2012多校题目,线段树求解输入两个字符串,只要判断相同长度部分即可,多出来的部分可以忽略。转化:判断两个字符串相同位置字符是否相同,如果相同置为1,不同为0那么问题就变成求 i到末尾的最长连续1的个数,当然起始点是 i线段树记录左边最长连续1,右边最长连续1,记录右边是因为 query的时候要判断如果 询问的 位置 i 是在左边,那么右区间可不可以合并#include#incl原创 2012-08-02 20:28:15 · 988 阅读 · 0 评论 -
poj 3225
线段树 求 区间 交,并,补。。区间并:[L,R] 赋值为 1 即可区间交:[0,L) (R,MAXN]更新为 0区间 S-T: [L,R] 更新为 0区间 T-S:[0,L) (R,MAXN] 更新为 0,[L,R] 1 更新为 0,0更新为 1,即进行异或操作区间对称差:[L,R] 1 更新为 0,0更新为 1. ( 对称差也可以定义为 (S并T)原创 2012-07-19 22:23:58 · 604 阅读 · 0 评论 -
hdu 4419 2012杭州网络赛
题目大意:给出一些有颜色的矩形,会重叠,问最后每种颜色的面积为多少。。当时网络赛不会做,最近学习了一下大神的做法,总算明白了。我们可以将 三基色 RGB 以及其 衍生出来的其他颜色 化成 二进制表示 xxx,三位分别表示BGB ,那么 001 就是 R,010就是G,100就是B,011就是 RG。。。以此类推,就构成了7个状态,开辟线段树,记录每个区间每种颜色的 长度,用扫描线从左往原创 2012-10-28 10:36:17 · 884 阅读 · 0 评论