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 }
  • 相关阅读:
    28完全背包+扩展欧几里得(包子凑数)
    HDU 3527 SPY
    POJ 3615 Cow Hurdles
    POJ 3620 Avoid The Lakes
    POJ 3036 Honeycomb Walk
    HDU 2352 Verdis Quo
    HDU 2368 Alfredo's Pizza Restaurant
    HDU 2700 Parity
    HDU 3763 CDs
    POJ 3279 Fliptile
  • 原文地址:https://www.cnblogs.com/sbwll/p/13231733.html
Copyright © 2011-2022 走看看