#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
#define st first
#define nd second
typedef pair<int,int> pun;
typedef long long ll;
ll sum(const vector<int>& v) {
ll res = 0;
for (auto x : v) res += x;
return res;
}
ll MAX = 2000 * 1000 * 1000;
long long new2(ll a) {
if (a < 2) return 0;
double x = (double(a) * double(a-1)) / 2.;
if (x > MAX) return MAX;
return min(MAX,( a * (a-1))) / 2;
}
long long new3(ll a) {
if (a < 3) return 0;
double x = (double(a) * double(a-1) * double(a-2)) / 6.;
if (x > MAX) return MAX;
return min(MAX, (((a * (a-1)) / 2) * (a-2)) / 3);
}
long long mul(ll a, ll b) {
double x = double(a) * double(b);
if (x > MAX) return MAX;
return min(MAX, a * b);
}
ll formula(ll left, ll mid, ll right) {
ll res = mul(mul(left, mid), right) + mul(new2(mid), (left + right)) + new3(mid);
return res;
}
bool check(ll sum, const vector<int>& v) {
// cerr << "check " << sum << "\n";
ll left = 0;
for (int i = 0; i < v.size(); i ++) {
if (v[i] == 0) continue;
ll mid_a = 1;
ll mid_b = sum - left;
while (mid_a < mid_b) {
ll s = (mid_a + mid_b) / 2;
ll right = sum - left - s;
if (i == v.size() - 1) right = 0;
if (formula(left, s, right) >= v[i]) mid_b = s;
else mid_a = s + 1;
}
// cerr << i << " must be " << mid_a << "\n";
ll right = sum - left - mid_a;
if (i == v.size() - 1) right = 0;
if (formula(left, mid_a, right) < v[i]) return false;
if (left + mid_a > sum) return false;
left += mid_a;
}
return true;
}
long long binary_search(long long a, long long b, const vector<int>& v) {
while (a < b) {
ll s = (a + b) / 2;
if (check(s, v)) {
// cerr << "OK\n";
b = s;
}
else a = s+1;
}
return a;
}
void test() {
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i ++) cin >> v[i];
long long mini = 0;
long long maxi = 3 * sum(v);
cout << binary_search(mini, maxi, v) << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while(t--) test();
}
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 | #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; #define st first #define nd second typedef pair<int,int> pun; typedef long long ll; ll sum(const vector<int>& v) { ll res = 0; for (auto x : v) res += x; return res; } ll MAX = 2000 * 1000 * 1000; long long new2(ll a) { if (a < 2) return 0; double x = (double(a) * double(a-1)) / 2.; if (x > MAX) return MAX; return min(MAX,( a * (a-1))) / 2; } long long new3(ll a) { if (a < 3) return 0; double x = (double(a) * double(a-1) * double(a-2)) / 6.; if (x > MAX) return MAX; return min(MAX, (((a * (a-1)) / 2) * (a-2)) / 3); } long long mul(ll a, ll b) { double x = double(a) * double(b); if (x > MAX) return MAX; return min(MAX, a * b); } ll formula(ll left, ll mid, ll right) { ll res = mul(mul(left, mid), right) + mul(new2(mid), (left + right)) + new3(mid); return res; } bool check(ll sum, const vector<int>& v) { // cerr << "check " << sum << "\n"; ll left = 0; for (int i = 0; i < v.size(); i ++) { if (v[i] == 0) continue; ll mid_a = 1; ll mid_b = sum - left; while (mid_a < mid_b) { ll s = (mid_a + mid_b) / 2; ll right = sum - left - s; if (i == v.size() - 1) right = 0; if (formula(left, s, right) >= v[i]) mid_b = s; else mid_a = s + 1; } // cerr << i << " must be " << mid_a << "\n"; ll right = sum - left - mid_a; if (i == v.size() - 1) right = 0; if (formula(left, mid_a, right) < v[i]) return false; if (left + mid_a > sum) return false; left += mid_a; } return true; } long long binary_search(long long a, long long b, const vector<int>& v) { while (a < b) { ll s = (a + b) / 2; if (check(s, v)) { // cerr << "OK\n"; b = s; } else a = s+1; } return a; } void test() { int n; cin >> n; vector<int> v(n); for (int i = 0; i < n; i ++) cin >> v[i]; long long mini = 0; long long maxi = 3 * sum(v); cout << binary_search(mini, maxi, v) << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin >> t; while(t--) test(); } |
English