NowCoder 9.9 模拟赛

T1.中位数

二分答案x,原序列大于x的置为1,小于x的置为-1,判断是否存在长度大于m的区间和大于0(也就是大于x的数多于小于x的数),若有,则ans>=x,否则ans<x

#include<iostream>
#include<cstdio>

using namespace std;

inline int rd(){
  int ret=0,f=1;char c;
  while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
  while(isdigit(c))ret=ret*10+c-'0',c=getchar();
  return ret*f;
}

const int MAXN=100005;

int n,m;

int a[MAXN],b[MAXN];
bool check(int x){
  int mn=1<<30;
  for(int i=1;i<=n;i++)b[i]=a[i]<x?-1:1;
  for(int i=1;i<=n;i++){
    if(i>=m) mn=min(mn,b[i-m]);
    b[i]+=b[i-1];
    if(i>=m&&b[i]>mn)return 1;
  }
  return 0;
}

int main(){
  n=rd();m=rd();
  int l=0,r=1<<29,mid,ans;
  for(int i=1;i<=n;i++) a[i]=rd();
  while(l<=r){
    mid=l+r>>1;
    if(check(mid))ans=mid,l=mid+1;
    else r=mid-1;
  }
  cout<<ans;
  return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/ghostcai/p/9613823.html
9.9