牛客小白月赛37 I 加减

Posted CCSU_Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客小白月赛37 I 加减相关的知识,希望对你有一定的参考价值。

题目链接

思路:枚举l,二分一个r,判断区间内全等于一个值是否满足修改次数小于等于k,因为区间是排序过的,所以只需拿出中位数,然后判断其他数到修改为中位数需要的修改次数是否小于等于k。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100010];
ll sum[100010];
ll check(int l,int r){
    int mid=(l+r)>>1;
    return a[mid]*(mid-l+1)-sum[mid]+sum[l-1]+(sum[r]-sum[mid])-a[mid]*(r-mid);
}
int main(){
    ll n,k;
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++){
        sum[i]=sum[i-1]+a[i];
    }
    int res=1;
    for(int i=1;i<=n;i++){
        int l=i,r=n,ans=0;
        while(l<=r){
            int mid=(l+r)>>1;
            if(check(i,mid)<=k){
                ans=max(ans,mid-i+1);
                l=mid+1;
            }
            else r=mid-1;
        }
        res=max(res,ans);
    }
    printf("%d\\n",res);
}

以上是关于牛客小白月赛37 I 加减的主要内容,如果未能解决你的问题,请参考以下文章

牛客小白月赛37 I 加减

牛客小白月赛37部分题解

牛客小白月赛37

牛客小白月赛37 E.紫妹永不服输(构造)

牛客网小白月赛1 B,I

牛客小白月赛 68 题解