#include<bits/stdc++.h> using namespace std; #define ll long long const ll MAXN = 2e5 + 7; ll tab[MAXN]; ll newton(ll n, ll k){ if(n < k){ return 0; } if(k == 2){ return n*(n-1)/2; } if(k == 3){ return n*(n-1)*(n-2)/6; } } bool check(ll x, ll n) { ll pref = 0; for (ll i = 1; i <= n; i++) { ll y = tab[i]; if (y == 0){ continue; } ll minn = min(x - pref, 200LL); if (newton(minn, 3) + newton(minn, 2)*(x - minn) + minn*pref*(x-pref-minn) < y) { //cerr << pref << " " << x << " " << i << "\n"; return false; } ll l = 0; ll r = minn; while (l + 1 < r) { ll z = (l + r) / 2; if (newton(z, 3) + newton(z, 2) * (x - z) + z * pref * (x - pref - z) >= y) { r = z; } else { l = z; } } pref += r; } return true; } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); ll T; cin >> T; while(T--){ ll n; cin >> n; for(ll i = 1; i <= n ; i++){ cin >> tab[i]; } //cerr << check(175, n) << "\n"; ll l = 0; ll r = 200*n; while(l+1 < r){ // cerr << l << " " << r << "\n"; ll x = (l+r)/2; if(check(x, n)){ r = x; } else{ l = x; } } cout << r << "\n"; } return 0; }
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 76 77 78 79 80 81 82 | #include<bits/stdc++.h> using namespace std; #define ll long long const ll MAXN = 2e5 + 7; ll tab[MAXN]; ll newton(ll n, ll k){ if(n < k){ return 0; } if(k == 2){ return n*(n-1)/2; } if(k == 3){ return n*(n-1)*(n-2)/6; } } bool check(ll x, ll n) { ll pref = 0; for (ll i = 1; i <= n; i++) { ll y = tab[i]; if (y == 0){ continue; } ll minn = min(x - pref, 200LL); if (newton(minn, 3) + newton(minn, 2)*(x - minn) + minn*pref*(x-pref-minn) < y) { //cerr << pref << " " << x << " " << i << "\n"; return false; } ll l = 0; ll r = minn; while (l + 1 < r) { ll z = (l + r) / 2; if (newton(z, 3) + newton(z, 2) * (x - z) + z * pref * (x - pref - z) >= y) { r = z; } else { l = z; } } pref += r; } return true; } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); ll T; cin >> T; while(T--){ ll n; cin >> n; for(ll i = 1; i <= n ; i++){ cin >> tab[i]; } //cerr << check(175, n) << "\n"; ll l = 0; ll r = 200*n; while(l+1 < r){ // cerr << l << " " << r << "\n"; ll x = (l+r)/2; if(check(x, n)){ r = x; } else{ l = x; } } cout << r << "\n"; } return 0; } |