zoukankan      html  css  js  c++  java
  • 中位数

    https://www.nowcoder.com/acm/contest/172/A

    此题中,区间的中位数为:最大的数,使得 区间内>=x的数个数 > <x的数个数

    二分答案x,把>=x的数标为1,<x的数标为-1,得到数组b,b数组的前缀和为数组c,那么就是要判断是否存在(0<=l,r<=n,r-l>=len)满足c[r]-c[l]>0;通过前缀最小值很容易完成

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<vector>
     5 using namespace std;
     6 #define fi first
     7 #define se second
     8 #define mp make_pair
     9 #define pb push_back
    10 typedef long long ll;
    11 typedef unsigned long long ull;
    12 typedef pair<int,int> pii;
    13 int n,len;
    14 int a[101000],b[101000],c[101000];
    15 bool judge(int x)
    16 {
    17     int i;
    18     for(i=1;i<=n;i++)    b[i]=(a[i]>=x)?1:-1,b[i]+=b[i-1];
    19     //for(i=1;i<=n;i++)  printf("%d ",b[i]);
    20     //puts("");
    21     //判断是否存在l,r,(r-l>=len),b[r]>b[l]
    22     c[0]=b[0];
    23     for(i=1;i<=n;i++)    c[i]=min(c[i-1],b[i]);
    24     for(i=len;i<=n;i++)
    25         if(b[i]>c[i-len])
    26             return 1;
    27     return 0;
    28 }
    29 int main()
    30 {
    31     int i,l,r,mid;
    32     scanf("%d%d",&n,&len);
    33     for(i=1;i<=n;i++)    scanf("%d",&a[i]);
    34     l=1;r=1e9;
    35     while(l!=r)
    36     {
    37         mid=l+((r-l)>>1);
    38         if(judge(mid+1))    l=mid+1;
    39         else    r=mid;
    40     }
    41     printf("%d",l);
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    git add --all
    docker进入数据库
    类里面函数调用
    http状态码
    在 python 中,for … else
    类怎么传参数 初始化函数
    Jmeter安装配置环境---小白看图安装
    冒泡排序
    Fiddler抓包【7】_次要功能和第三方插件
    Fiddler抓包【6】_Fiddler Script
  • 原文地址:https://www.cnblogs.com/hehe54321/p/9738062.html
Copyright © 2011-2022 走看看