2011年11月1日
摘要: POJ_2352 由于我们在读入数据的时候已知了前面星星的个数,实际上再减去当前星星右边的星星的数量即可,因此我们可以用一个线段树存储横坐标区间里的星星个数,每读入一个星星就修改并查询一次,并记录level即可。#include<stdio.h>#include<string.h>#define MAXD 32010#define MAXN 15010int M, N, tree[4 * MAXD], num[MAXN];void init(){ for(M = 1; M < 32003; M <<= 1); memset(tree, 0, sizeo 阅读全文
posted @ 2011-11-01 18:58 Staginner 阅读(237) 评论(0) 推荐(0) 编辑
摘要: POJ_3468(1) 在消化了PPT上思想之后,又重新做了一下这个题目。 不妨将原数组的元素记作a[i],然后我们用堆建立两棵线段树,一棵的原数组为x[i](x[i]=a[i]-a[i-1],即原数组的差分数组),另一棵的原数组为ix[i](ix[i] = i*x[i])。 为什么要这么做呢?原因如下。 如果我们记S[i]为x[i]的前缀和,我们会发现S[i]实际上就是a[i],也就是说差分的前缀和就等于原数组中的对应元素(因而才说差分是前缀和的逆运算)。我们不妨设SS[i]为S[i]的前缀和,在求区间和时用SS[b]–SS[a-1]自然是很方便的,然而对于修改操作,无论是维护S[i... 阅读全文
posted @ 2011-11-01 15:57 Staginner 阅读(212) 评论(0) 推荐(0) 编辑
摘要: POJ_3468 现在用的方法还是比较慢的,因为YTQ给我那个PPT还没深入研究透,PPT上面对这种的题的解法是用维护前缀和的前缀和以及{n*An}的前缀和来实现的,而我用的方法就是比较朴素的做lazy标记,来标识该区间内每个元素增加了多少。如果需要查询子区间时,再更新子区间的和,并将lazy标记传递下去。#include<stdio.h>#include<string.h>#define MAXD 100010int N, M, Q;long long int tree[4 * MAXD], lazy[4 * MAXD], res;int left[4 * MAXD] 阅读全文
posted @ 2011-11-01 01:09 Staginner 阅读(282) 评论(2) 推荐(0) 编辑
摘要: UVA_12299 首先分析简单的情况,数字代表最大堆,2必胜,3必输,4必胜,……其实偶数必胜是显然的,但奇数就不好说了,于是我们换个角度考虑。 如果说3必输的话,那么最后能把最大堆是3的情况留给Bob那么自己必然会赢,而能确保最大堆是3的情况就只有4、5、6了,而对于7,无论自己如何设置,都会把4、5、6其中的一个留给Bob,故自己必输。 同理,7必输的话,把7留给Bob就必胜,于是…… 这样推完,其实Bob能赢的情况就是在n=2^k-1(k = 2, 3, 4,…)的时候,其他时候Alice都是必胜的。#include<stdio.h>int main(){ int n; . 阅读全文
posted @ 2011-11-01 00:14 Staginner 阅读(440) 评论(0) 推荐(0) 编辑