做法是二分极差,然后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;
}