E - Amusement Park
题目描述:
思路:
#include <bits/stdc++.h>
using namespace std;
#define endl '
'
#define inf 0x3f3f3f3f
#define mod 1000000007
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
typedef long long ll;
typedef pair <int,int> pii;
#define MAX 300000 + 50
ll n, m, k;
ll tr[MAX];
bool check(ll mid){
m = 0;
for(int i = 1; i <= n; ++i){
m += max(0ll, tr[i] - mid);
}
if(m < k)return true;
else return false;
}
void work(){
cin >> n >> k;
for(int i = 1; i <= n; ++i){
cin >> tr[i];
}
ll l = 0, r = 2000000001;
while (l <= r) {
ll mid = (l + r) / 2;
if(check(mid))r = mid - 1;
else l = mid + 1;
}
ll ans = 0;
++l;
for(int i = 1; i <= n; ++i){
if(tr[i] < l)continue;
k -= (tr[i] - l + 1);
ans += max(0ll, (tr[i] - l + 1) * (tr[i] + l) / 2);
}
--l;
while (k--) {
ans += l;
}
cout << ans << endl;
}
int main(){
io;
work();
return 0;
}