首页 > 其他分享 >ARC101B Median of Medians - 二分 - 树状数组 -

ARC101B Median of Medians - 二分 - 树状数组 -

时间:2022-10-11 09:48:18浏览次数:78  
标签:return 树状 int Medians Median mid maxn include ARC101B

题目链接:https://atcoder.jp/contests/arc101/tasks/arc101_b

题解:
直接求序列的中位数不好求,考虑分析性质:
设\(b_i = (-1) ^{[a_i \geq k]}\),如果\([l,r]\)的中位数小于 k,那么b的和一定大于0,而且这个和一定随k增大而增大
这个单调性启示我们可以对外层的中位数二分答案
但是直接统计b的区间和是\(O(n^2)\)的,不符合要求,考虑前缀和优化
\(b[l..r] >= 0\) 等价于 \(s[r] - s[l-1] >= 0, s[r] >= s[l-1]\),因此对于每一个r,考虑统计s值更小的顺序对,这可以用树状数组简单实现

// by SkyRainWind
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define pii pair<int,int>

using namespace std;

typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, maxn =2e5+10, bs = 1e5+1;

int n,a[maxn],bit[maxn],sum[maxn];
int lb(int x){return x & (-x);}
int query(int x){
	int r = 0;
	for(int i = x;i;i-=lb(i))r += bit[i];
	return r;
}

void upd(int x){
	for(int i=x;i<=maxn - 5;i+=lb(i))++ bit[i];
}

int check(int k){
	LL r = 0;
	for(int i=0;i<=maxn - 5;i++)bit[i] = 0;
	for(int i=1;i<=n;i++)sum[i] = a[i] >= k ? -1 : 1;
	for(int i=2;i<=n;i++)sum[i] += sum[i-1];
	for(int i=1;i<=n;i++)r += sum[i] > 0 ? 1 : 0; 
	
	for(int i=1;i<=n;i++)
		r += query(sum[i] - 1 + bs), upd(sum[i] + bs);
	
	return r <= 1ll * n * (n+1) / 4;
}

signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	int l=1, r=1e9, ans;
	while(l <= r){
		int mid = l+r>>1;
		if(check(mid))l = mid+1, ans = mid;
		else r = mid-1;
	}
	printf("%d\n",ans);

	return 0;
}

标签:return,树状,int,Medians,Median,mid,maxn,include,ARC101B
From: https://www.cnblogs.com/SkyRainWind/p/16778149.html

相关文章

  • PAT Advanced 1029 Median(25)
    题目描述:GivenanincreasingsequenceSofNintegers,themedianisthenumberatthemiddleposition.Forexample,themedianofS1={11,12,13,14}is1......
  • NC50940 Running Median
    题目原题地址:RunningMedian题目编号:NC50940题目类型:对顶堆时间限制:C/C++5秒,其他语言10秒空间限制:C/C++65536K,其他语言131072K1.题目大意多组数据,每组有标号、......
  • 【luogu AT2366】Prefix Median(DP)
    PrefixMedian题目链接:luoguAT2366题目大意给你一个长度为2n-1的序列,你可以任意排序它们,问你有多少个不同的b数组。b数组的第i位为a数组1~2i-1区间的数的......
  • LeetCode 295 Find Median from Data Stream
    Themedianisthemiddlevalueinanorderedintegerlist.Ifthesizeofthelistiseven,thereisnomiddlevalueandthemedianisthemeanofthetwomidd......
  • 「AGC012F」Prefix Median 题解 (DP)
    题目简介给定一个长度为\(2n-1\)的序列\(a\),你可以随意排列\(a\)中的元素,请求出有多少种不同的序列\(b\),满足\(b\)的长度为\(n\)。\(b_i=\{a_1\ldotsa_{2......