#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'; } } |