Above the Median

 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 }
原文地址:https://www.cnblogs.com/sbwll/p/13231733.html