Codeforces1486 D. Max Median(01二分)

题意:

在这里插入图片描述

解法:

二分答案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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/115253690