#include<bits/stdc++.h> #define int long long using namespace std; const int maxn = 2e5 + 7; vector<int> arr(maxn); int check_point(int l, int x, int k){ int r = k - x - l; int sum1 = l*x*r; int sum2 = 0, sum3 = 0; if(x >= 2) sum2 = (x*(x-1)/2)*(k - x); if(x >= 3) sum3 = (x*(x-1)*(x-2))/6; return sum1 + sum2 + sum3; } bool check(int n, int k){ int l = 0; for(int i = 0; i < n - 1; i++){ int lo = 0, hi = k - l; int res = -1; while(lo <= hi){ int mid = (lo + hi)/2; if(check_point(l, mid, k) >= arr[i]){ res = mid; hi = mid - 1; } else lo = mid + 1; } //cout << i << " " << res << endl; if(res == -1) return false; l += res; } return(check_point(l, k - l, k) >= arr[n - 1]); } void solve(){ int n; cin >> n; for(int i = 0; i < n; i++) cin >> arr[i]; int l = 3, r = 1e6 + 7, mid; int res = r; //cout << check(n, 3) << "\n"; while(l <= r){ mid = (l + r)/2; if(check(n, mid)){ res = min(res, mid); r = mid - 1; } else l = mid + 1; } cout << res << "\n"; } signed main(){ ios_base::sync_with_stdio(0), cin.tie(0); int t; cin >> t; while(t--) solve(); }
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 | #include<bits/stdc++.h> #define int long long using namespace std; const int maxn = 2e5 + 7; vector<int> arr(maxn); int check_point(int l, int x, int k){ int r = k - x - l; int sum1 = l*x*r; int sum2 = 0, sum3 = 0; if(x >= 2) sum2 = (x*(x-1)/2)*(k - x); if(x >= 3) sum3 = (x*(x-1)*(x-2))/6; return sum1 + sum2 + sum3; } bool check(int n, int k){ int l = 0; for(int i = 0; i < n - 1; i++){ int lo = 0, hi = k - l; int res = -1; while(lo <= hi){ int mid = (lo + hi)/2; if(check_point(l, mid, k) >= arr[i]){ res = mid; hi = mid - 1; } else lo = mid + 1; } //cout << i << " " << res << endl; if(res == -1) return false; l += res; } return(check_point(l, k - l, k) >= arr[n - 1]); } void solve(){ int n; cin >> n; for(int i = 0; i < n; i++) cin >> arr[i]; int l = 3, r = 1e6 + 7, mid; int res = r; //cout << check(n, 3) << "\n"; while(l <= r){ mid = (l + r)/2; if(check(n, mid)){ res = min(res, mid); r = mid - 1; } else l = mid + 1; } cout << res << "\n"; } signed main(){ ios_base::sync_with_stdio(0), cin.tie(0); int t; cin >> t; while(t--) solve(); } |