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;
}