zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    数据库作业
    数据库知识点⑤
    数据库知识点④
    一个值得纪念的日子
    设计模式之单件模式
    HDU 5441 Travel
    HDU 5483 Nux Walpurgis
    Markdown 测试
    HDU 3271 SNIBB
    HDU 5536 Chip Factory
  • 原文地址:https://www.cnblogs.com/sbwll/p/13231733.html
Copyright © 2011-2022 走看看