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;
}
标签:int,mid,中位数,CQOI2009,MAXN,P1627,currnum,first
From: https://www.cnblogs.com/augpath/p/16865448.html