void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

文章分类 -  树状数组+线段树

摘要:给出一个广告牌大小,给出n个广告的长度,每个广告高度占一行,按照顺序尽量安排广告在靠左上角位置问,每次给出一个广告长度,求出在哪一行?很难想到线段树啊。。。。把行数给建树了,val维护当前区间的行内某行最大的空位数,然后安排的时候,优先左树去用有点类似二分了。。。。#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h># 阅读全文
posted @ 2011-08-08 00:34 void-man 阅读(343) 评论(1) 推荐(0)

摘要:这几天反正磕磕绊绊吧这两部分东西整完了,确切的说是基础给整完了。。。。那就意味着出现套模版的题还是能做上,稍微变形那还是白扯。。首先弄的是树状数组,树状数组,把一个区间利用位的方式分割成多个其他区间的和,然后更新期中一个时候可以用较少的操作次数来更新整体的每个的值,比如区间和int lowbit(i... 阅读全文
posted @ 2011-08-07 01:10 void-man 阅读(457) 评论(0) 推荐(0)

摘要:排队买票,依次给出当前人要插队的位置,然后问你最后整个的序列是神马?这个题目很想往线段树上考虑,后来看了题解,大牛说的是这样,由于左后一个人插进来后他的位置肯定是固定的我们就可以倒着来插,最后一个固定后,如果倒数第二个插入的序号小于当前那么就往前插到序号上,否则往后插,往后的话序号需要减去当前这个数左边的空位数因为左右都是从0位置开始标记的因此结构体里需要维持节点左右边的空位个数,当前插队序号小于左边空位插左边,大于的话插右边,但是需要需要减去左边空位。。因为右边也是从0位置开始算起的,并且我们是倒着插,所以空位个数才是当时的需要插的位置,已经被占的位置当时还不存在..#include < 阅读全文
posted @ 2011-08-07 00:21 void-man 阅读(817) 评论(0) 推荐(0)

摘要:一样的题,简单面积并,直接套模版就行#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#include <string.h>#include <algorithm>#define MID(x,y) ((x+y)>>1)#define L(x) (x<<1)#define 阅读全文
posted @ 2011-08-07 00:12 void-man 阅读(239) 评论(0) 推荐(0)

摘要:给出几个矩形的面积,求出相并的总面积....之前做的感觉都挺水的,现在是线段树的高级点应用了,明显感觉到很难理解了,肿么办啊???慢慢看吧具体不在这里说了,线段树学习一文里有指出...#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#include <string.h>#include <algo 阅读全文
posted @ 2011-08-07 00:08 void-man 阅读(252) 评论(0) 推荐(0)

摘要:转换成区间染色问题吧。。。。给你一个区间,默认是第一种色,然后再给出一个区间以及一种颜色开始染,最后是求出整个区间上所有颜色的价值是多少,三种色,1,2,3类似于区间求和问题,常规不能用依旧需要保持一个增量来做,还有个办法就是区间染色问题来做,维持区间的颜色和不是和,最后get把每个区间段的颜色求出最后再求个和就ok...区间求和#include <cmath>#include <cstdio>#include <cstdlib>#include <iostream>#include <cstring>#include <str 阅读全文
posted @ 2011-08-07 00:04 void-man 阅读(121) 评论(0) 推荐(0)

摘要:给出一系列操作,更新某一区间上所有数加上一个数,然后求出某一区间上所有数的和。。。用常规的线段树模版TLE。。。数据量太大,这里有个办法是当求出某一区间上要加某个数时,用一个新变量来保存当前增量,不往下更新了。。。然后再下次更新或者查询时候每次到一个t都进行对增量的更新,否则就一直维持这t上的增量,这样的好处是避免了不必要的更新,因为没必要每次都把某个区间计算出它的和,只是根据需要时候再计算...#include <cmath>#include <cstdio>#include <cstdlib>#include <iostream>#inclu 阅读全文
posted @ 2011-08-06 23:59 void-man 阅读(569) 评论(0) 推荐(0)

摘要:给出一根木棒长度,没单位一距离为一段,从0开始标号的。。。。然后给出区间进行黑白染色,查询所给区间内总共有多少根木棒,被颜色隔开的。。在这里用一个变量保存当前区间的颜色,要求是此区间必须全都是一种颜色,否则col=-1如果要在这个区间染色的话,那么根节点的col要传递到两个子节点,根节点再赋值为-1,因为此时这个区间不再同色,但是在更新之前两个子区间同色要把状态传递下去 。。#include <cmath>#include <cstdio>#include <cstdlib>#include <iostream>#include <cstr 阅读全文
posted @ 2011-08-06 23:50 void-man 阅读(229) 评论(0) 推荐(0)

摘要:给出n个牛的高度,然后询问所给区间内牛的最大高度差是多少?这题比较简单一点是不用更新,每次只是询问,那么可以直接用两个变量mmax,mmin来保存查找过程中的最大与最小高度值,两个差即可#include <cmath>#include <cstdio>#include <cstdlib>#include <iostream>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <stack 阅读全文
posted @ 2011-08-06 23:41 void-man 阅读(157) 评论(0) 推荐(0)

摘要:给出东西两岸的城市,然后再给出他们之间修建高速的对应关系,求出所有高速路交叉的点的个数...简单树状数组题,这次用线段树做一下吧,首先把左边的坐标按照降序排列,来更新右边坐标 ,顺遍这题来弄个线段树模版吧#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#include <string.h>#includ 阅读全文
posted @ 2011-08-06 23:38 void-man 阅读(309) 评论(1) 推荐(0)

摘要:题目给出一个矩形某几个坐标有数,然后给你一个给定的大小的矩形放置到里面,问如何才能让这个矩形里面的树最多...这题数据比较弱弱才100,所以首先尝试了下暴力,竟然0ms过了,还是再用树状来一遍吧,在这种数据下树状体现不出优势啊,16ms过啊啊二维树状数组其实就是更新操作时候多了一层而已,套两层循环直接就ok就是在最后求解的时候需要用到容斥定理,套用一下小媛大牛的图吧暴力枚举求解:#include <stdio.h>#include <string.h>#define N 105int map[N][N];int main(){ int n,w,h,sum,result, 阅读全文
posted @ 2011-08-03 01:00 void-man 阅读(448) 评论(0) 推荐(0)

摘要:给出一个苹果树,是一棵树,在每个节点出有一个苹果,然后根节点标号总为1,给出一棵树,上来都有苹果然后给出一些节点上的操作,操作是进行相反状态有和没有苹果的改变,给出一些询问操作,就是某个节点的子树上所有苹果,包括自己这题说实话,今天下午耗时最大理解时间最长的题了。。。。首先用邻接表存储这棵树,然后由于这棵树的节点标号是任意的,所以想到用dfs遍历树一遍后按照访问的次序给树标号,当然也能够求出某个节点当前的号low[x],和最后一颗字数节点的号high[x],得出一个区间,这个区间上的苹果数就是x节点和子树的苹果数然后就对一个苹果的新标号进行update这题就解决了。。。。。有个小问题就是如何判 阅读全文
posted @ 2011-08-03 00:50 void-man 阅读(769) 评论(0) 推荐(0)

摘要:这个题比较难点,不过记得之前刚接触树状数组时候做过这题,当时搞明白了,可是今天看了后,又没点思路了。。。后来看了代码才明白题目有两种操作,插入一个数,询问区间内有插入数的个数由于数据比较大,所以也不能用简单的模版来套,依旧要离散化啊啊先把所有的操作数给存储起来,包括询问的数,放一个数组里,然后排序之,另外按照操作的顺序再把数据放到队列里一份之后从队列取数据,二分当前数据在数组里的下标,然后用下标来更新操作另外需要注意的是,数组里不光存储了插入的数,询问操作的数也要放进去,这样才能给这俩数分配下标后进行get操作ps:这里用了下系统函数bsearch,感觉不错,不过也手写了一个二分,时间当然还是 阅读全文
posted @ 2011-08-03 00:41 void-man 阅读(248) 评论(0) 推荐(0)

摘要:比较简单的应用,中文题,三种操作需要注意一点,这次update更新函数需要增加一个参数,应为人数有增删两种操作#include <stdio.h>#include <string.h>#define MAX 100010int c[MAX],a[MAX];int lowbit(int x){ return x&(-x);}void update(int x,int val){ while(x<MAX) { c[x]+=val; x+=lowbit(x); }}int get(int x){ int sum=0; while(x>0) { sum+=c 阅读全文
posted @ 2011-08-03 00:33 void-man 阅读(180) 评论(0) 推荐(0)

摘要:给出一组数据,需要交换相邻的数据使得最后从小到达排列好。。。。。省赛一道题啊啊啊!!!求逆序数呗,当时我用树状数组,可恶的long long啊啊这道题直接套模版不行,因为数据特别大并且还有负数,所以必须给离散化,把所有数据标号后从小到大排列,然后按照其数组下标把每个数据重新赋值, 从1-N这样离散的数据就被重新聚合起来了,可以直接套模版了因为交换次数跟数据值没关,只跟他们大小关系序列有关,因次赋值后大小关系不变。。。#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAX 5000 阅读全文
posted @ 2011-08-03 00:30 void-man 阅读(319) 评论(0) 推荐(0)

摘要:给出几颗星星的坐标,求出每颗星星不超出他坐标范围的星星有几颗,不包括自己由于题目给出的坐标是先x后y从小到大给出的序列,因此不用排序直接套模版树状数组~用x依次来更新其他数据#include <stdio.h>#include <string.h>#define N 16000#define M 33000int c[M],num[N];int lowbit(int x){ return x&(-x);}void update(int x){ while(x<M) { c[x]++; x+=lowbit(x); }}int get(int x){ int 阅读全文
posted @ 2011-08-03 00:22 void-man 阅读(312) 评论(0) 推荐(0)

摘要:给出N,M,K从N向M连K条边,问有多少个交点?可以把左边的序列进行从大到小排序,然后求右边的序列中,大于当前值的有多少组,把每组数的满足此条件的个数加起来就是题目要求直接往后递归可以得出答案O(n^2),但是超时,所以可以用树状数组,每次可以把当前数向上更新,把每个数小于自己的数的个数进行更新#include <stdio.h>#include <string.h>#include <algorithm>#define MAX 1010using namespace std;long long c[MAX];long long sum;int N,M,K; 阅读全文
posted @ 2011-05-19 21:58 void-man 阅读(181) 评论(0) 推荐(0)