随笔分类 -  线段树

摘要:变量,此题维持3个变量,假设区间l[l,r]这个区间需要保存这个区间的最大值,从l开始的最大值,以及以r结尾的最大值,对于COVER空闲为1,非空闲为0.大概思路:对与1:先query操作找出能够容纳给定范围的第一个下标,然后update更新操作。 对于2:操作直接update操作query操作:根据大小需要的连续房间进行qury操作,当然要先进行pushdown操作,即将当前节点cover状态赋予子代, 然后如果这个需要的房间大小如果小于其左孩子的大小 则访问孩子,另外如果是左孩子的右最大值+右孩子的左孩子最大值 大于value,很明显,就是直接左边孩子的开始处,如... 阅读全文
posted @ 2012-06-14 04:08 woaiyy 阅读(242) 评论(0) 推荐(0)
摘要:操作含义:我们一个一个操作来分析:(用0和1表示是否包含区间,-1表示该区间内既有包含又有不包含)U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换COVER[ID]=1表示用1覆盖去见,COVER[ID]=0,表示用0覆盖区间,COVER[ID]=-1,表示其子区间既有1覆盖又有0覆盖的请款,对于每个节点使用覆盖或者异或操作标记延迟,1:如果一个区间遇上覆盖标记,则其异或标清空,2:如果一个区间是覆盖标记,pushdown操作使得其孩子区间的异或标志位变为 阅读全文
posted @ 2012-06-11 03:50 woaiyy 阅读(721) 评论(0) 推荐(0)
摘要:题目连接:http://poj.org/problem?id=3468成断增加,注意的是求和可能超过32位,用__int64存储,成断更新的时候注意color为+-,而不是替换,有可能出现儿子的值还存在没有向下更新。。#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#define MAXN 100010__int64 color[MAXN<<2];__int64 tree[MAXN<<2];int n,num;void build_tree( 阅读全文
posted @ 2012-06-07 17:34 woaiyy 阅读(207) 评论(0) 推荐(0)
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1698这道题是成段更新,使用延迟标记,对于当前的left<=l&&right>=r直接返回,等到下次更新搜索到时候才向下更新,push_down;#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#define MAXN 200010int color[MAXN<<2];int tree[MAXN<<2];void bui 阅读全文
posted @ 2012-06-06 16:15 woaiyy 阅读(174) 评论(0) 推荐(0)
摘要:题目连接:http://poj.org/problem?id=2886这道题是模拟约瑟夫环,其具体实现和poj2826差不多的。我的代码如下:#include<cstdio>#include<cstdlib>#include<cmath>#include<memory.h>int seg_tree[500010<<2];void build_tree(int l,int r,int id);void push_tree_up(int id);void update_tree(int value,int l,int r,int id); 阅读全文
posted @ 2012-06-05 15:09 woaiyy 阅读(535) 评论(0) 推荐(0)
摘要:这道题是从最后一个数开始建立线段树,区间存储的范围是该区间有多少个空位剩余,对于最后一个插入的数,它肯定和其插入的位置一致,例如对于测试数据的第一组,69插入2这个位置,是肯定的,它将前面占有2位置的数向后面推,同理对于倒数第二个数,占有1这个位置,如果前面有数占有1这个位置,此时前面的必定是向后面推。假设P为插入的位置,因次每次查看左区间有没有大于等于p的空位,如果有则搜索,否者搜索右孩子。#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#define MAXN 阅读全文
posted @ 2012-05-30 01:22 woaiyy 阅读(399) 评论(0) 推荐(0)
摘要:本题注意的是虽然长和宽的范围很广,数组开不下,但是需要注意的是n的值却很只有20000个,对于H>N的情况区间只需要1——N,因为最多能有N个,但是对于N>H的情况,当然,区间就最大只能开1-N,因为板只有那么大,区间开的就是为它们两者之间最小的那一个。#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#define MAXN 200002void build_tree(int l,int r,int id);void push_up_tree(int i 阅读全文
posted @ 2012-05-29 14:40 woaiyy 阅读(214) 评论(0) 推荐(0)
摘要:本题为是对逆序对的查找,问题可为在某个区间共有多少个数被输入,首先为查找初始的逆序对数,然后求将第一个数加入到最后的逆序对数,设初始的逆序对数总共为SUM这将第一个数加入到最后的的逆序对数为SUM加上比A1大的数减去比A1小的数字。即为当前的逆序对数,如此类推,求的比逆序对数最小的。。。View Code #include<cstdio>#include<cstdlib>#include<cstdlib>#include<cstring>#define MAXN 5010int seg_tree[MAXN<<2];void build 阅读全文
posted @ 2012-05-29 00:28 woaiyy 阅读(180) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1754线段树功能:#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#define MAXN 200005int seg_tree[MAXN<<2];void build_tree(int l,int r,int id);int query_tree(int left,int right,int l,int r,int id);void update_point_tree 阅读全文
posted @ 2012-05-28 04:47 woaiyy 阅读(173) 评论(0) 推荐(0)
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1166#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#define MAXN 50005int seg_tree[MAXN<<2];void build_tree(int l,int r,int id);int query_tree(int left,int right,int l,int r,int id);void update_point_tree(i 阅读全文
posted @ 2012-05-28 04:06 woaiyy 阅读(217) 评论(0) 推荐(0)
摘要:线段树:旨在自己看,题目来源与报告来自http://www.notonlysuccess.com/index.php/segment-tree-complete/是某位大牛写的,很犀利。。。(1):单点更新 HDU 1166敌兵布阵 http://acm.hdu.edu.cn/showproblem.php?pid=116View Code #include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#define MAXN 50005int seg_tree[MAXN< 阅读全文
posted @ 2012-05-28 04:03 woaiyy 阅读(321) 评论(0) 推荐(0)