#include <bits/stdc++.h>
using namespace std;
#define ll long long
constexpr int maxn = 2e5+2;
int n;
ll arr[maxn];
inline ll dw3(ll x)
{
if(x < 3) return 0;
return (x*(x-1)*(x-2))/6;
}
inline ll dw2(ll x)
{
if(x < 2) return 0;
return (x*(x-1))/2;
}
bool check(ll k)
{
ll pref = 0, x;
for(int i=1; i<=n; i++)
{
if(k-pref < 0) return 0;
if(arr[i] == 0) x=0;
else
{
ll l=0, r=k-pref;
while(l < r)
{
ll mid=(l+r)/2;
if((dw3(mid) + dw2(mid)*(k-mid) + mid*pref*(k-mid-pref)) >= arr[i]) r = mid;
else l = mid+1;
}
if((dw3(l) + dw2(l)*(k-l) + l*pref*(k-l-pref)) >= arr[i]) x=l;
else return 0;
}
pref += x;
if(k-pref < 0) return 0;
}
return 1;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--)
{
cin >> n; ll lb=0, ub=0, sum=0;
for(int i=1; i<=n; i++)
{
cin >> arr[i]; sum += arr[i];
ll tmp=0;
while(dw3(tmp) < arr[i]) tmp++;
ub += tmp;
}
while(dw3(lb) < sum) lb++;
ll l=lb,r=min(ub,200008LL);
while(l < r)
{
ll mid=(l+r)/2;
if(check(mid)) r = mid;
else l = mid+1;
}
cout << l << '\n';
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include <bits/stdc++.h> using namespace std; #define ll long long constexpr int maxn = 2e5+2; int n; ll arr[maxn]; inline ll dw3(ll x) { if(x < 3) return 0; return (x*(x-1)*(x-2))/6; } inline ll dw2(ll x) { if(x < 2) return 0; return (x*(x-1))/2; } bool check(ll k) { ll pref = 0, x; for(int i=1; i<=n; i++) { if(k-pref < 0) return 0; if(arr[i] == 0) x=0; else { ll l=0, r=k-pref; while(l < r) { ll mid=(l+r)/2; if((dw3(mid) + dw2(mid)*(k-mid) + mid*pref*(k-mid-pref)) >= arr[i]) r = mid; else l = mid+1; } if((dw3(l) + dw2(l)*(k-l) + l*pref*(k-l-pref)) >= arr[i]) x=l; else return 0; } pref += x; if(k-pref < 0) return 0; } return 1; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--) { cin >> n; ll lb=0, ub=0, sum=0; for(int i=1; i<=n; i++) { cin >> arr[i]; sum += arr[i]; ll tmp=0; while(dw3(tmp) < arr[i]) tmp++; ub += tmp; } while(dw3(lb) < sum) lb++; ll l=lb,r=min(ub,200008LL); while(l < r) { ll mid=(l+r)/2; if(check(mid)) r = mid; else l = mid+1; } cout << l << '\n'; } } |
English