2012年3月14日
摘要: HDU_3437 比较容易证明,x应该取区间的中位数,于是问题就转化成了求[l,r]区间内大小排第(l+r)/2+1的数,然后将和计算出来即可。 求区间的中位数可以用划分树来实现,但是和却不可以在求得中位数后再利用原序列直接计算,因为原区间的元素是无序的,我们没办法进行作差求和。联想作差求和的条件,即要明确哪些数是比中位数大,哪些数比中位数小,而划分树恰好左子树的元素总是比右子树小,于是如果中位数在左子树中,我们自然可以将右子树中[l,r]区间内的数与中位数的差先求出来,如果中位数在右子树中,我们就可以先将左子树中[l,r]区间内的数与中位数的差先求出来,求和的过程可以在求得中位数的具体值后回 阅读全文
posted @ 2012-03-14 22:02 Staginner 阅读(316) 评论(0) 推荐(0) 编辑
摘要: POJ_2104 上课之前大概看了一下划分树,后来上课的时候自己YY了一个“划分树”,结果发现每次查询复杂度不是logn的,大约是logn*logn的,写出来之后一交好像跟归并树的复杂度差不多,也就这个就是归并树吧…… 今天不早了,就先睡了,等明天起来之后再仔细研究一下划分树怎么写吧。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 400010#define MAXM 2000010int N, M, a[MAXD], x[MAXM], p, left[M 阅读全文
posted @ 2012-03-14 00:30 Staginner 阅读(250) 评论(0) 推荐(0) 编辑