用二分找到穷人财产的最大值a, 富人财产的最小值b.
若b > a,答案为b - a;
若b <= a,则求出n个人的财产总合sum,若sum % n == 0,则答案为0,否则为1.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define maxn 500005
#define INF 1e18
using namespace std;
typedef long long ll;
int num[maxn];
int n, k;
ll sum;
bool Ismax(int d){
int t = k;
int m = lower_bound(num, num+n, d) - num;
for(int i = 0; i < m; i++){
t -= d - num[i];
if(t < 0)
return false;
}
return true;
}
bool Ismin(int d){
int t = k;
int m = upper_bound(num, num+n, d) - num;
for(int i = m; i < n; i++){
t -= num[i] - d;
if(t < 0)
return false;
}
return true;
}
int main(){
// freopen("in.txt", "r", stdin);
scanf("%d%d", &n, &k);
sum = 0;
for(int i = 0; i < n; i++){
scanf("%d", num+i);
sum += num[i];
}
sort(num, num+n);
int l = 0, r = 1000000001;
while(l < r){
int mid = l + ((r - l) >> 1);
if(Ismax(mid))
l = mid + 1;
else
r = mid;
}
int maxs = l - 1;
l = 0, r = 1000000001;
while(l < r){
int mid = l + ((r - l) >> 1);
if(Ismin(mid))
r = mid;
else
l = mid + 1;
}
if(maxs >= l){
if(sum % n == 0)
cout << 0 << endl;
else
cout << 1 << endl;
}
else
cout << l - maxs << endl;
return 0;
}