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