D. Max Median 題解(二分+思維)


題目鏈接

題目大意

給你一個長度為\(n(1\leq n \leq2e5)\)的數組

要你求至少長度為\(k(1<=k<=n)\)的連續數組的中位數的最大值

題目思路

感覺是沒一點思路

首先假設數組只有1和-1的元素

那么怎么判斷這個答案為1還是-1

可以利用前綴和與前綴和的前綴的最小值

來計算答案是1還是-1

然后觀察發現最終的答案可以二分

check的時候大於等於這個值當作1,否則當作-1

代碼

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+5,inf=0x3f3f3f3f;
const int eps=1e-3;
const ll mod=1004535809;
int n,k;
int a[maxn];
int pre[maxn],premi[maxn];
bool check(int x){
    for(int i=1;i<=n;i++){
        pre[i]=pre[i-1]+(a[i]>=x?1:-1);
        premi[i]=min(premi[i-1],pre[i]);
    }
    for(int i=k;i<=n;i++){
        if(pre[i]-premi[i-k]>0){
            return 1;
        }
    }
    return 0;
}
signed main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    int l=1,r=n,ans;
    while(l<=r){
        int mid=(l+r)/2;
        if(check(mid)){
            ans=mid;
            l=mid+1;
        }else{
            r=mid-1;
        }
    }
    printf("%d\n",ans);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM