P1627 [CQOI2009] 中位数

Idea

注意到中位数只关心数据的相对大小, 因此考虑从目标数字开始往两边求前/后缀和, 接下来使用乘法原理来进行组合即可. 可以用map统计.

第一次感觉只要看一看扩展, 当时忽略了这些扩展之间可以组合.

Code

#include <bits/stdc++.h>
using namespace std;

#define MAXN 320005
#define F(i, a, b) for(int i=a; i<=b;i++)
#define Fd(i, a, b) for(int i=a;i>=b;i--)

map<int, int> l, r;
int a[MAXN], b[MAXN];

signed main(){
	int n, B; cin>>n>>B;
	F(i, 1, n) cin>>a[i];
	int mid = -1;
	F(i, 1, n) {
		if(a[i]==B) {
			b[i] = 0;
			mid = i;
		}
		else if(a[i]>B) b[i] = 1;
		else b[i] = -1;
	}
	int currnum = 0;
	F(i, mid, n) {
		currnum += b[i];
		r[currnum] ++;
	}
	currnum = 0;
	Fd(i, mid, 1){
		currnum += b[i];
		l[currnum] ++;
	}
	int ans = 0;
	for(auto i : l){
		// printf("(%d)+= %d * %d\n",i.first, i.second, r[-i.first]);
		ans += i.second*r[-i.first];
	}
	cout<<ans<<endl;
}
posted @ 2022-11-07 11:45  Micoael_Primo  阅读(22)  评论(0)    收藏  举报