WA on #8求debug
查看原帖
WA on #8求debug
797769
manbaOUT楼主2025/7/25 13:32

做法是二分极差,然后check用双指针,#8跟正确答案就差1

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005],prea[100005],sufa[100005],n,k,l,r;
bool check(int diff){
    int lp=1,rp=1;
    while(lp<=n&&rp<=n){
        while(a[rp]-a[lp]<=diff&&rp<=n)rp++;
        if((a[lp]*(lp-1)-prea[lp-1])+(sufa[rp]-(a[lp]+diff)*(n-rp+1))<=k)return true;
        lp++;
    }
    return false;
}
int main(){
    cin>>n>>k;
    prea[0]=sufa[0]=0;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)prea[i]=prea[i-1]+a[i];
    for(int i=n;i>=1;i--)sufa[i]=sufa[i+1]+a[i];
    l=0,r=a[n]-a[1];
    while(l<r){
        ll mid=l+(r-l)/2;
        if(check(mid))r=mid;
        else l=mid+1;
    }
    cout<<l;
}
2025/7/25 13:32
加载中...