#include <bits/stdc++.h> using namespace std; #define int long long int tab[200007]; int n; bool check(int L, int X, int R, int i) { __int128 m = (__int128)tab[i]; __int128 l = (__int128)(L); __int128 x = (__int128)(X); __int128 r = (__int128)(R); // cout << "check " << l << " " << x << " " << r << " " << m << "\n"; // cout << l * x * r + (x * (x - 1) * (l + r)) / 2 + (x * (x - 1) * (x - 2)) / 6 << "\n"; return l * x * r + (x * (x - 1) * (l + r)) / 2 + (x * (x - 1) * (x - 2)) / 6 >= m; } bool enoughL(int w) { // cout << "enough " << w << "\n"; int l = 0, r = w; for (int i = 0; i < n; i++) { if (tab[i] > 0) { if (r <= 0) return false; int p = 1, k = r; while (p < k) { int s = (p + k) / 2; if (!check(l, s, r - s, i)) { p = s + 1; } else { k = s; } } if (!check(l, p, r - p, i)) { return false; } // cout << "assign " << i << " " << p << "\n"; l += p; r -= p; } } return true; } bool enoughR(int w) { //cout << "enough " << w << "\n"; int l = w, r = 0; for (int i = n - 1; i >= 0; i--) { if (tab[i] > 0) { if (l <= 0) return false; int p = 1, k = l; while (p < k) { int s = (p + k) / 2; if (!check(l, s, l - s, i)) { p = s + 1; } else { k = s; } } if (!check(l - p, p, r, i)) { return false; } //cout << "assign " << i << " " << p << "\n"; l -= p; r += p; } } return true; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t > 0) { t--; cin >> n; int p = 0, k = 2; for (int i = 0; i < n; i++) { cin >> tab[i]; k += tab[i]; } while (p < k) { int s = (p + k) / 2; if (!enoughL(s)) { p = s + 1; } else { k = s; } } cout << p << "\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 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 | #include <bits/stdc++.h> using namespace std; #define int long long int tab[200007]; int n; bool check(int L, int X, int R, int i) { __int128 m = (__int128)tab[i]; __int128 l = (__int128)(L); __int128 x = (__int128)(X); __int128 r = (__int128)(R); // cout << "check " << l << " " << x << " " << r << " " << m << "\n"; // cout << l * x * r + (x * (x - 1) * (l + r)) / 2 + (x * (x - 1) * (x - 2)) / 6 << "\n"; return l * x * r + (x * (x - 1) * (l + r)) / 2 + (x * (x - 1) * (x - 2)) / 6 >= m; } bool enoughL(int w) { // cout << "enough " << w << "\n"; int l = 0, r = w; for (int i = 0; i < n; i++) { if (tab[i] > 0) { if (r <= 0) return false; int p = 1, k = r; while (p < k) { int s = (p + k) / 2; if (!check(l, s, r - s, i)) { p = s + 1; } else { k = s; } } if (!check(l, p, r - p, i)) { return false; } // cout << "assign " << i << " " << p << "\n"; l += p; r -= p; } } return true; } bool enoughR(int w) { //cout << "enough " << w << "\n"; int l = w, r = 0; for (int i = n - 1; i >= 0; i--) { if (tab[i] > 0) { if (l <= 0) return false; int p = 1, k = l; while (p < k) { int s = (p + k) / 2; if (!check(l, s, l - s, i)) { p = s + 1; } else { k = s; } } if (!check(l - p, p, r, i)) { return false; } //cout << "assign " << i << " " << p << "\n"; l -= p; r += p; } } return true; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t > 0) { t--; cin >> n; int p = 0, k = 2; for (int i = 0; i < n; i++) { cin >> tab[i]; k += tab[i]; } while (p < k) { int s = (p + k) / 2; if (!enoughL(s)) { p = s + 1; } else { k = s; } } cout << p << "\n"; } } |