#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int a[200000];
ll calc(ll l, ll r, ll x) {
return (x*(x-1)*(x-2))/6+(((x*(x-1))/2) * (l+r))+(l*r*x);
}
bool ok(int n, int k) {
int l = 0, r = k;
for (int i = 0; i < n; i++) {
int p = 0, q = r+1, mid;
while (p < q) {
mid = (p+q)/2;
if (calc(l, r-mid, mid) >= a[i]) q = mid;
else p = mid+1;
}
if (p == r+1) return false;
l += p;
r -= p;
}
return true;
}
void solve() {
int n; cin >> n;
int cnt = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int p = 0, q = 250000, mid;
while (p < q) {
mid = (p+q)/2;
if (ok(n, mid)) q = mid;
else p = mid+1;
}
cout << p << '\n';
}
int 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 | #include <bits/stdc++.h> typedef long long ll; using namespace std; int a[200000]; ll calc(ll l, ll r, ll x) { return (x*(x-1)*(x-2))/6+(((x*(x-1))/2) * (l+r))+(l*r*x); } bool ok(int n, int k) { int l = 0, r = k; for (int i = 0; i < n; i++) { int p = 0, q = r+1, mid; while (p < q) { mid = (p+q)/2; if (calc(l, r-mid, mid) >= a[i]) q = mid; else p = mid+1; } if (p == r+1) return false; l += p; r -= p; } return true; } void solve() { int n; cin >> n; int cnt = 0; for (int i = 0; i < n; i++) { cin >> a[i]; } int p = 0, q = 250000, mid; while (p < q) { mid = (p+q)/2; if (ok(n, mid)) q = mid; else p = mid+1; } cout << p << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--) { solve(); } } |
English