#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL C2(LL n) {
if (n < 2) return 0;
return n * (n - 1) / 2;
}
LL C3(LL n) {
if (n < 3) return 0;
return n * (n - 1) * (n - 2) / 6;
}
bool check(const vector<LL>& s, LL m) {
int n = s.size();
LL p_prev = 0;
for (int j = 1; j <= n; ++j) {
LL low = p_prev;
LL high = m;
LL best_p = -1;
while (low <= high) {
LL mid = low + (high - low) / 2;
LL val = C3(mid) + C2(mid) * (m - mid);
if (val >= s[j - 1]) {
best_p = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
if (best_p == -1) return false;
p_prev = best_p;
}
return p_prev <= m;
}
void solve(){
int n;
cin >> n;
vector<LL> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
vector<LL> s(n);
s[0] = a[0];
for (int j = 1; j < n; ++j) {
s[j] = s[j - 1] + a[j];
}
LL low = 0;
LL high = 1e6;
LL ans = -1;
while (low <= high) {
LL mid = low + (high - low) / 2;
if (check(s, mid)) {
ans = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
cout << ans << '\n';
}
int main() {
cin.tie(0)->sync_with_stdio(0);
int t;
cin >> t;
while(t--)solve();
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 | #include <bits/stdc++.h> using namespace std; typedef long long LL; LL C2(LL n) { if (n < 2) return 0; return n * (n - 1) / 2; } LL C3(LL n) { if (n < 3) return 0; return n * (n - 1) * (n - 2) / 6; } bool check(const vector<LL>& s, LL m) { int n = s.size(); LL p_prev = 0; for (int j = 1; j <= n; ++j) { LL low = p_prev; LL high = m; LL best_p = -1; while (low <= high) { LL mid = low + (high - low) / 2; LL val = C3(mid) + C2(mid) * (m - mid); if (val >= s[j - 1]) { best_p = mid; high = mid - 1; } else { low = mid + 1; } } if (best_p == -1) return false; p_prev = best_p; } return p_prev <= m; } void solve(){ int n; cin >> n; vector<LL> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } vector<LL> s(n); s[0] = a[0]; for (int j = 1; j < n; ++j) { s[j] = s[j - 1] + a[j]; } LL low = 0; LL high = 1e6; LL ans = -1; while (low <= high) { LL mid = low + (high - low) / 2; if (check(s, mid)) { ans = mid; high = mid - 1; } else { low = mid + 1; } } cout << ans << '\n'; } int main() { cin.tie(0)->sync_with_stdio(0); int t; cin >> t; while(t--)solve(); return 0; } |
English