#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#define FOR(i, l, r) for(int i = (l); i <= (r); ++i)
#define REP(i, n) FOR(i, 0, (n) - 1)
#define ssize(x) int(x.size())
template<class A, class B> auto &operator<<(ostream &o, pair<A, B> p) {
return o << '(' << p.first << ", " << p.second << ')';
}
template<class T> auto operator<<(ostream &o, T x) -> decltype(x.end(), o) {
o << '{'; int i = 0; for (auto e : x) o << (", ")+2*!i++ << e;
return o << '}';
}
#ifdef DEBUG
#define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n';
#else
#define debug(...) {}
#endif
LL rt_3(LL n) {
LL l = 1, r = n;
while (l < r) {
LL mid = (l + r + 1) / 2;
if (mid * mid * mid > n)
r = mid - 1;
else
l = mid;
}
return l;
}
LL choose_3(LL n) {
return n * (n - 1) * (n - 2) / 6;
}
LL choose_2(LL n) {
return n * (n - 1) / 2;
}
void solve() {
int n;
cin >> n;
LL mx = 0;
vector<LL> a(n);
REP(i, n) {
cin >> a[i];
mx = max(mx, a[i]);
}
LL l = 1, r = mx * n + 2;
while (l < r) {
debug(l, r);
LL mid = (l + r) / 2;
LL left = 0, total = mid;
REP(i, n) {
if (a[i] == 0)
continue;
LL lc = 1, rc = 2 * rt_3(a[i]) + 4;
rc = min(rc, total - left);
LL curr_sum = choose_3(rc) + choose_2(rc) * (total - rc) +
rc * left * (total - left - rc);
if (curr_sum < a[i]) {
left = mid + 1;
break;
}
while (lc < rc) {
LL c = (lc + rc) / 2;
debug(lc, rc, c);
curr_sum = choose_3(c) + choose_2(c) * (total - c) +
c * left * (total - left - c);
// debug(curr_sum);
if (curr_sum >= a[i])
rc = c;
else
lc = c + 1;
}
debug(rc);
left += rc;
}
if (left <= mid)
r = mid;
else
l = mid + 1;
}
cout << l << '\n';
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int q;
cin >> q;
while (q--)
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #include <bits/stdc++.h> using namespace std; using LL = long long; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) #define ssize(x) int(x.size()) template<class A, class B> auto &operator<<(ostream &o, pair<A, B> p) { return o << '(' << p.first << ", " << p.second << ')'; } template<class T> auto operator<<(ostream &o, T x) -> decltype(x.end(), o) { o << '{'; int i = 0; for (auto e : x) o << (", ")+2*!i++ << e; return o << '}'; } #ifdef DEBUG #define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n'; #else #define debug(...) {} #endif LL rt_3(LL n) { LL l = 1, r = n; while (l < r) { LL mid = (l + r + 1) / 2; if (mid * mid * mid > n) r = mid - 1; else l = mid; } return l; } LL choose_3(LL n) { return n * (n - 1) * (n - 2) / 6; } LL choose_2(LL n) { return n * (n - 1) / 2; } void solve() { int n; cin >> n; LL mx = 0; vector<LL> a(n); REP(i, n) { cin >> a[i]; mx = max(mx, a[i]); } LL l = 1, r = mx * n + 2; while (l < r) { debug(l, r); LL mid = (l + r) / 2; LL left = 0, total = mid; REP(i, n) { if (a[i] == 0) continue; LL lc = 1, rc = 2 * rt_3(a[i]) + 4; rc = min(rc, total - left); LL curr_sum = choose_3(rc) + choose_2(rc) * (total - rc) + rc * left * (total - left - rc); if (curr_sum < a[i]) { left = mid + 1; break; } while (lc < rc) { LL c = (lc + rc) / 2; debug(lc, rc, c); curr_sum = choose_3(c) + choose_2(c) * (total - c) + c * left * (total - left - c); // debug(curr_sum); if (curr_sum >= a[i]) rc = c; else lc = c + 1; } debug(rc); left += rc; } if (left <= mid) r = mid; else l = mid + 1; } cout << l << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int q; cin >> q; while (q--) solve(); return 0; } |
English