Untitled

 avatar
unknown
c_cpp
10 months ago
2.0 kB
13
Indexable
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 5, maxadad = 1e9;
long long n, k, arr[maxn], psaval[maxn], psakhar[maxn];

int bs_bishtar(int adad, int l, int r){
	int mid;
	while(l + 1 < r){
		mid = (r + l) / 2;
		if(arr[mid] <= adad){
			l = mid;
		}
		else{
			r = mid;
		}
	}
	return r;
}

int bs_kamtar(int adad, int l, int r){
	int mid;
	while(l + 1 < r){
		mid = (r + l) / 2;
		if(arr[mid] < adad){
			l = mid;
		}
		else{
			r = mid;
		}
	}
	return l;
}

long long op_count(int l, int r){
	int ind_kam = bs_kamtar(l, -1, n);
	int ind_bish = bs_bishtar(r, -1, n);
	long long opkam = 0, opbish = 0;
	if(ind_kam != -1){
		opkam = 1ll * l * (ind_kam + 1) - psaval[ind_kam];
	}
	if(ind_bish != n){
		opbish = 1ll * psakhar[ind_bish] - r * (n - ind_bish);
	}
	
	return opkam + opbish;
}

int bs_dareh(int bazeh, int l, int r){
	int mid1, mid2;
	long long op1, op2;
	while(l + 1 < r){
		mid1 = (l + r) / 2;
		mid2 = mid1 + 1;
		op1 = op_count(mid1, mid1 + bazeh);
		op2 = op_count(mid2, mid2 + bazeh);
		
		if(op1 < op2){
			r = mid1;
		}
		else{
			l = mid2;
		}
	}
	
	op1 = op_count(l, l + bazeh);
	op2 = op_count(r, r + bazeh);
	
	if(op1 > op2){
		return r;
	}
	return l;
}

bool bs_bazeh_check(int bazeh){
	int l = bs_dareh(bazeh, 1, maxadad - bazeh);
	int r = l + bazeh;
	long long op = op_count(l, r);
	if(op <= k){
		return 1;
	}
	return 0;
}

int bs_bazeh(int l, int r){
	int mid;
	while(l + 1 < r){
		mid = (l + r) / 2;
		if(!bs_bazeh_check(mid)){
			l = mid;
		}
		else{
			r = mid;
		}
	}
	return r;
}

int main(){
	cin >> n >> k;
	for(int i = 0; i < n; i++){
		cin >> arr[i];
	}	
	sort(arr, arr + n);
	for(int i = 0; i < n; i++){
		psaval[i] = arr[i];
		if(i){
			psaval[i] += psaval[i - 1];
		}
	}
	for(int i = n - 1; i >= 0; i--){
		psakhar[i] = arr[i];
		if(i < n - 1){
			psakhar[i] += psakhar[i + 1];
		}
	}
	
	cout << bs_bazeh(-1, maxadad);
}
Editor is loading...
Leave a Comment