线段树
vsooda
这个作者很懒,什么都没留下…
展开
-
HDU 1166
接下来的线段树题目,主要来源于notonlysuccess。 第一题: #include #define lson l, m , rt << 1 #define rson m+1, r, rt << 1 | 1 const int maxn = 55555; int sum[maxn<<2]; void pushUp(int rt) { sum[rt] = sum[rt<<1] + s原创 2013-01-02 19:05:49 · 487 阅读 · 0 评论 -
HDU 1754 线段树 及其 入门知识
刚开始以为看到这道题是提交,ac的人很多,以为是水题,用最简单的方法操作,超时! 线段树!! 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N原创 2012-09-15 20:38:00 · 914 阅读 · 1 评论 -
HDU 1394 最小逆序数
#include using namespace std; #define lson l, m , rt << 1 #define rson m+1, r, rt << 1 | 1 const int maxn = 5555; int sum[maxn<<2]; void pushUp(int rt) { sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } void原创 2013-01-02 20:06:53 · 617 阅读 · 0 评论 -
HDU 2795
题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子 思路:每次找到最大值的位子,然后减去L 线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了).转自not only success #include using namespace std; #define lson l, m , rt << 1 #define rson m+1原创 2013-01-02 20:34:27 · 1034 阅读 · 0 评论 -
HDU 1698 线段树进阶,成段更新
成段更新(通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候 #include using namespace std; #define lson l, m, rt << 1 #define rson m+1, r, rt << 1 | 1 const int maxn = 111原创 2013-01-02 22:10:16 · 714 阅读 · 0 评论 -
PKU 2528 WA
题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要1000,1990,2000,2012就够原创 2013-01-03 20:29:25 · 631 阅读 · 0 评论 -
PKU 3468
与上题类似。只是变成了累加。每次更新的时候要更新sum值(加) 多了query的操作。与update类似 #include using namespace std; #define lson l, m, rt << 1 #define rson m+1, r, rt << 1 | 1 #define LL long long const int maxn = 1111111; LL add原创 2013-01-03 14:42:42 · 741 阅读 · 0 评论 -
PKU 3225
题意:区间操作,交,并,补等 思路: 我们一个一个操作来分析:(用0和1表示是否包含区间,-1表示该区间内既有包含又有不包含) U:把区间[l,r]覆盖成1 I:把[-∞,l)(r,∞]覆盖成0 D:把区间[l,r]覆盖成0 C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换 S:[l,r]区间0/1互换 成段覆盖的操作很简单,比较特殊的就是区间0/1原创 2013-01-03 21:36:54 · 470 阅读 · 0 评论