• 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 }
  • 相关阅读:
    简单的多重背包
    完美子图
    活动投票
    人品问题
    售票系统
    最短路径
    优美值
    前端-常用函数记录-持续更新
    前端-单点登录中cookie中domain的思考
    大白话说GIT常用操作,常用指令git操作大全
  • 原文地址:https://www.cnblogs.com/sbwll/p/13231733.html
Copyright © 2020-2023  润新知