转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。
给你一个长度为n的序列s。
回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。
其中a 位置也从0开始标号。
http://www.lydsy.com/JudgeOnline/problem.php?id=2653
CLJ的题,强制在线处理了。
要求中位数最大,首先二分中位数,然后判断可行不可行。
判断X可行不可行,对于区间内的数,凡是>=X的标为1,否则为-1。这样的话,求一次最大区间和
如果大于等于0,则说明可行。
检验一下就很明白了。
这就是关键了,不过不能每次去暴力。快速求解子段和可以用线段树解决 ,但是对于不同的X,不可能建立多棵线段树
这就可以用主席树解决
对于初始的数,可以离散化,也可以不需要,直接排序,然后按从小到大依次建立主席树。
初始的话全为1,然后不断修改-1。有了之前的可持久化的基础,这步就很轻松了
然后就类似线段树一样,维护一个区间和,最大的左连续和,最大的右连续和。
结合在一起的时候,debug了下。。。。弱爆了
#include
#include
#include