Above the Median
农夫约翰把他的N(1 <= N <= 100,000)奶牛排在一排来衡量他们的高度,牛i有:高度H_I(1 <= H_I <= 1,000,
000,000)纳米 – 因为FJ认为他需要精确测量!他想选择一些连续的奶牛拍一张照片发给牛摄影大赛。大赛有一
个很奇怪的规则,对所有提交的照片:照片有效当且仅当,它描绘了一群中位身高至少大于一定的阈值X(1 <= x
<= 1,000,000,000)的奶牛。中位身高定义为:有n头奶牛按从小到大顺序排好,第[(1+n)/2](取上限)头奶牛的身高
。例如{7,3,2,6}的中位数是6,和{5,4,8}的中位数是5。FJ想知道他有多少种选择。
输入
*第1行:两个用空格隔开的整数:N和X
*第2 .. N 1:第i行1包含单个整数H_I。
输出
*第1行:选择的个数,注意,该数可能超出32位整数的存储范围。
样例
输入
4 6 10 5 6 2
输出
7
提示
有10个可能选择。其中,只有7 个的中位数大于6。它们是{10},{6},{10,5},{5,6},{6,2},{10, 5,6},{1
0,5,6,2}
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define lowbit(x) x&(-x) 4 using namespace std; 5 ll sum[1000001],n,f[1000001],ans,a[1000001],k; 6 void add(ll x,ll val) { 7 while(x<=2*n+1) { 8 sum[x]+=val; 9 x+=lowbit(x); 10 } 11 } 12 ll ask(ll x) { 13 ll ans=0; 14 while(x) { 15 ans+=sum[x]; 16 x-=lowbit(x); 17 } 18 return ans; 19 } 20 int main() { 21 scanf("%lld%lld",&n,&k); 22 for(ll i=1; i<=n; i++) { 23 scanf("%lld",&a[i]); 24 if(a[i]>=k) 25 f[i]=f[i-1]+1; 26 else 27 f[i]=f[i-1]-1; 28 } 29 add(n+1,1); 30 for(ll i=1; i<=n; i++) { 31 ans+=ask(f[i]+1+n); 32 add(f[i]+1+n,1); 33 } 34 printf("%lld ",ans); 35 return 0; 36 }