随笔分类 -  线段树

摘要:一道二维的树状数组题:这里要注意初始化,View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing nam 阅读全文
posted @ 2012-08-01 22:50 wutaoKeen 阅读(420) 评论(0) 推荐(0)
摘要:三维的树状数组:对单点更新,跟二维的一样:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing na 阅读全文
posted @ 2012-08-01 20:48 wutaoKeen 阅读(207) 评论(0) 推荐(0)
摘要:可以用二维线段树与二维树状数组做:二位数状数组:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing 阅读全文
posted @ 2012-08-01 16:12 wutaoKeen 阅读(231) 评论(0) 推荐(0)
摘要:二位线段树:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;class Node{public: int 阅读全文
posted @ 2012-08-01 12:59 wutaoKeen 阅读(215) 评论(0) 推荐(0)
摘要:一道二维线段树题,求区间最大值:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespa 阅读全文
posted @ 2012-08-01 11:01 wutaoKeen 阅读(195) 评论(0) 推荐(0)
摘要:这个题可以用二位数状数组也可以用二维线段树做:法一:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusi 阅读全文
posted @ 2012-07-31 09:14 wutaoKeen 阅读(132) 评论(0) 推荐(0)
摘要:题意:给你一段内存单元,你可以对它进行一下操作:开辟一个内存块,如果开辟成功返回该内存块最左边的值;删除包含X的内存段元,如果成功输出该内存块的左右值;找到第X快内存块,如果成功输出该内存块的最左边的值;清除内存;这个题的思想与http://poj.org/problem?id=3667是一样的;这题还要做一个处理的是建立一个链表把之前的内存块首尾点给存储起来,这样就容易对它进行操作;其余的地方与Hotel一样,这里就不累叙了;View Code #include<iostream>#include<cstdio>#include<cstring>#incl 阅读全文
posted @ 2012-03-06 13:02 wutaoKeen 阅读(322) 评论(0) 推荐(0)
摘要:该题是一道,成段更新,单点查询(简单线段树+简单DP),这个题与http://poj.org/problem?id=1436思想差不多,这里我就不重复了,这里就是要处理最大值的问题也就是DP;我有的方法就是以该条边的两个端点往下搜索,如果下面有可见的边,选择值的那条边,然后再进行更新;#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;class Node{public: int l ,r , sum,cover; }; 阅读全文
posted @ 2012-02-28 15:22 wutaoKeen 阅读(226) 评论(0) 推荐(0)
摘要:题目大意:在一个平面内,有一些竖直的线段,若两条竖直线段之间可以连一条水平线,这条水平线不与其他竖直线段相交,称这两条竖直线段为“相互可见”的。若存在三条竖直线段,两两“相互可见”,则构成“线段三角形”。给出一些竖直的线段,问一共有多少“线段三角形”。首先处理端点问题:想象一下若同一x位置有两条线段,y坐标为1~2和3~4。其实中间的空当2~3之间是可以引水平线段的,而这里我们都用整数处理,那条水平线段就被忽略了,可能会导致有一些水平相互可见的线段在计算中被忽略了,这里我们扩大y坐标之间的空间,这时我们就可以多出一个整数来便于我们的整数处理,这样就可以简单地处理端点问题,并且它对于所有情况都有 阅读全文
posted @ 2012-02-27 18:55 wutaoKeen 阅读(756) 评论(0) 推荐(0)
摘要:该题是个大水体。在这里我设一个color(相当于lazy)来记录这个区间改变的颜色,在更新的时候,我是把值往下更新的,这样就可以保证下面颜色改变同时也可以对下次的颜色改变没影响;这里我设立了一个全局变量Color[]里面的每个值代表一种颜色,false代表不存在,true代表存在;我们往下搜索的时候如果遇到color不为零时我没就把Color[color]=true;赋值之后就不要往下搜索因为color已经代表这个区间了;最后来个暴力搜索所有的出现的颜色;#include<iostream>#include<cstdio>#include<string.h> 阅读全文
posted @ 2012-02-26 15:01 wutaoKeen 阅读(229) 评论(0) 推荐(0)
摘要:该题与http://poj.org/problem?id=3667是同一类型的题目,这里就不多说了,因为HOTEL注释的比较详细。#include<cstdio>#include<iostream>#include<vector>using namespace std;class Node {public: int l,r; int l_value,r_value; int cover; };Node tree[250024];class Tree{public: void Maketree( int l,int r, int cnt ); void ... 阅读全文
posted @ 2012-02-26 12:55 wutaoKeen 阅读(420) 评论(0) 推荐(0)
摘要:该题是道成段更新,寻找空间(经典类型,求一块满足条件的最左边的空间)代码的注释比较详细,这里就不多说了。#include<iostream>#include<cstdio>#include<cstring>using namespace std;class Node{public: int l ,r; int l_value,r_value,max; /*l_value从左节点数起的最大连续空闲区间 r_value从右节点起的最大连续空闲区间 max//整个区间的最大连续空闲区间 */ int cover; //当前区间的占用情况,... 阅读全文
posted @ 2012-02-26 12:53 wutaoKeen 阅读(209) 评论(0) 推荐(0)
摘要:题意:有一块长方形的广告板,往上面贴广告,然后给n个1*wi的广告,要求把广告贴上去,如果前面的行可以贴,就要贴前面的并且要靠左贴,前面的贴不下就贴在下面,广告的高度是wi,如果能贴在上面输出最小的高度,如果不能就输出-1。解题思路:如果以行数为区间,建立线段树,他给的h有10^9次,是创不了10^9这么大的数组的。然而我们知道给定N个广告,应为宽度一定,那么最高也不会超过N;只是我们可以开4×N为数组来建树;我把最后树的叶子节点表示广告牌的高度,并且左边的高度小于右边的;而父节点存储子节点的最大剩余值,如果最大值都比wi都小,则表示该节点不可能贴上广告,那么我们就要回朔到上一个节点 阅读全文
posted @ 2012-02-24 18:31 wutaoKeen 阅读(652) 评论(0) 推荐(0)
摘要:该题是一道区间求和的问题,同时对区间值进行改变,这里我们用到lazy,以便我们不要更新到每个节点,直到我们要用到时我们才往下传递,这样就可以节省时间;#include<cstdio>#include<iostream>#include<cstring>using namespace std;class Node{ public: int l,r,mid; long long lazy,sum;};Node tree[400024];long long num[100024];class Tree{ public: void Maketree( in... 阅读全文
posted @ 2012-02-24 15:33 wutaoKeen 阅读(229) 评论(0) 推荐(0)
摘要:该题是一道简单的线段树题目,关键就是区间更新的问题,更新时不要更新到每个节点,而是更新到他们的包括他们的所有节点的父节点就可以了,当有新的更新时,就把父节点的原先的更新更新到子节点,这样就可以尽量保证不必要的重复更新。#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;class Node{public: int l,r,mid; int value;};Node tree[400024];class Tree{public: void Maketree( int l, 阅读全文
posted @ 2012-02-17 19:02 wutaoKeen 阅读(243) 评论(0) 推荐(0)
摘要:这是一道简单的入门的线段树的题目:#include<cstdio>#include<iostream>#include<cstdlib>using namespace std;class Node{public: int l,r,mid; int max,count;};Node tree[800024];int num[200024];class Tree{public: int Max( int a,int b ) { return a>b?a:b; } int Qestion( int l,int r,int cnt ); void M... 阅读全文
posted @ 2012-02-15 21:52 wutaoKeen 阅读(230) 评论(0) 推荐(0)
摘要:该题可以用树状数组也可以用线段数;树状数组:#include<stdio.h>#include<stdlib.h>#include<string.h>int c[50024],sum[50024],N;int lowbit(int x){ return x&(-x); }int SUM(int n){ int sum=0; while(n){ sum=sum+c[n]; n-=lowbit(n); } return sum; }void add(int n,int num){ while(n<=N){ ... 阅读全文
posted @ 2012-02-15 19:56 wutaoKeen 阅读(287) 评论(0) 推荐(0)