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

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/14415471.html