zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
    不摆烂了,写题
  • 相关阅读:
    react条件渲染
    js用replaceAll全部替换的方法
    批量重命名图片,去除括号
    [转]自定义alert弹框,title不显示域名
    [转]ASCII码表及扩展ASCII码表,方便查阅
    [转]PHP中file_put_contents追加和换行
    Response
    Redirect
    Request
    Paginator
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/14415471.html
Copyright © 2011-2022 走看看