10 2011 档案

摘要:题目大意:一群候选人要在墙上贴海报,海报可以相互重叠,问贴完了以后还有多少海报可以看见。等价于一道经典的线段树问题:给x轴染色,染不同的颜色,问最后x轴上有多少颜色。先设定每个节点有一个color域,为零的时候就是x轴的颜色,-1就是这个区间有多种颜色,给每种颜色标一个序号i当所到达的区间有多种颜色(即color==-1)时,就继续向下更新当所到达的区间只有一种颜色(即color>=0)时,就更新我需要更新的区间,然后把左边和右边的区间更新下去(第一次就是这里没有写,seg fault了好几次)还要注意两个问题,一个是要离散化,再一个是poj的区间的表示和我先开始写的不一样,导致wa了两 阅读全文
posted @ 2011-10-10 21:34 ω 提拉米兔 ℃ 阅读(298) 评论(2) 推荐(0) 编辑
摘要:这是我的第一道线段树呀吼吼~~~~~虽然这道题很简单,但是我写的时候还是犯了很多错误,RE了几次,还是属于没有理解线段树到底是怎么分段的。。。把自己的代码对着标改把改把过了,发现跑了3000+MS,怎么这么慢,然后我就去网上找了很多大神的线段树代码拿来交,发现都是3000+MS,才知道原来还有更好的做法,比如ST什么的。。。用数组模拟整个线段树,要求开由于N即为线段树最底层的节点数,则线段树最高为(ceil)log2N+1=17层;则线段树最多有2^17-1个节点=131071 ,所以开了150000~~a274003264Accepted2428K3375MSG++1635B2011-10- 阅读全文
posted @ 2011-10-05 12:20 ω 提拉米兔 ℃ 阅读(257) 评论(0) 推荐(0) 编辑
摘要:有n个点,标号1到n,给定数组b[i]表示i前面比a[i]小的点的个数,求a[]数组。我们倒着扫b数组,将符合条件的最大的数插入a数组相应的位置,就得解了。但是朴素查找需要很多时间,就需要用数状数组了。维护一个c数组,sum(i)表示现在有几个数字不大于i,因为sum(i)是有序的,所以我们每次查找的时候就用二分查找就行了,在找到这个点以后,就从c数组中删去。总的复杂度为O(n * logn * logn)先开始二分写搓了,改了老半天,唉,二分还是太弱了阿。。2011-10-03 15:07:11RosieYeOrdering the Soldiersaccepted editrun2.544 阅读全文
posted @ 2011-10-03 21:22 ω 提拉米兔 ℃ 阅读(397) 评论(0) 推荐(0) 编辑
摘要:理解了很久。。首先分析一维的情况:首先对于每个数A定义集合up(A)表示{A, A+lowestbit(A), A+lowestbit(A)+lowestbit(A+lowestbit(A))...} 定义集合down(A)表示{A, A-lowestbit(A), A-lowestbit(A)-lowestbit(A-lowestbit(A)) ... , 0}。可以发现对于任何A<B,up(A)和down(B)的交集有且仅有一个数。这样,在改变区间[a,b]时,我们只用更改down(b)和down(a-1)的值,用数状数组实现。在求点i的状态的时候就直接求up(i).因为之前所说的性 阅读全文
posted @ 2011-10-03 17:21 ω 提拉米兔 ℃ 阅读(256) 评论(0) 推荐(0) 编辑