题意:
解法:
二分答案mid.
由于只需要关注是否存在长度>=k的子区间,
满足中位数>=mid,
因此可以将>=mid的数修改为1,
将<mid的数修改为-1.
那么我们check就是判断是否存在一个长度>=k的子区间,
满足区间和>0,
令b[i]表示修改后数组的前缀和,
令mi[i]表示b[1,i]的前缀min,
如果存在b[i]-mi[i-k]>0,那么有解,否则无解.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+5;
int a[maxm];
int b[maxm];
int mi[maxm];
int n,k;
int check(int mid){
for(int i=1;i<=n;i++){
if(a[i]>=mid)b[i]=1;
else b[i]=-1;
}
for(int i=1;i<=n;i++){
b[i]+=b[i-1];
mi[i]=min(mi[i-1],b[i]);
}
for(int i=k;i<=n;i++){
if(b[i]-mi[i-k]>0)return 1;
}
return 0;
}
void solve(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
int l=1,r=n;
while(l<=r){
int mid=(l+r)/2;
if(check(mid))ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
}
signed main(){
solve();
return 0;
}