Median of Medians - AtCoder arc101_b - Virtual Judge
寻找中位数们的中位数,使用二分搜索,在数列a的最小值和最大值之间搜索,
在一列数m1,m2,m3......m_n中,如果x是他们的中位数,应该满足大于等于x的数的数目大于等于
n-[n/2],并且x是满足该条件的最大数
比如1,2,3,4中,x=3是满足两个数(4-[4/2])大于等于x的最大x值
比如 1,2,3,4,5中,x=3是满足三个数(5-[5/2])大于等于x的最大x值
所以可以统计,在所有的中位数中,满足大于等于x的数的个数
如果统计给定一个区间[l,r],快速判断这个区间的中位数是否大于等于x呢:
通过观察,将这个区间的数不降序排列后,如果区间内大于等于x的数的数目(区间中数的个数为n)大于等于(n-[n/2]),则该区间的中位数大于等于x
比如1 2 3 4,x=3,大于等于3的个数是2=4-[4/2]
比如1 2 3 4 5,x=3,大于等于3的个数是3=5-[5/2]
将一个区间中的数分成两类,大于等于x的数令其为1,否则令其为-1,则当这个区间的数的和大于等于0的时候,这个区间的中位数大于等于x
例如1 2 3 4,变为 -1 -1 1 1,和为0
这样处理后,求一个区间的和可以通过前缀和快速计算,给定区间端点l和r,如果pref[r]-pref[l-1]>=0,则这个区间的中位数大于等于x
通过移项得到 pref[r]>=pref[l-1],(r>=l>l-1),也就是

最低0.47元/天 解锁文章
529

被折叠的 条评论
为什么被折叠?



