#include <bits/stdc++.h>
// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2")
#define int long long
using namespace std;
// int min_ludzie(int lewo, int prawo, int wymagane)
// {
// if (wymagane == 0)
// return 0;
// for (int biore = 1; biore < 190; biore++)
// {
// for (int dokladam = 0; dokladam <= biore; dokladam++)
// {
// int b = biore - dokladam;
// int b3 = (b * (b - 1) * (b - 2)) / 6;
// int b2 = (b * (b - 1)) / 2;
// int c = prawo - b;
// int a = lewo + dokladam;
// if (b3 + a * c * b + (a + c) * b2 >= wymagane)
// {
// return biore;
// }
// }
// }
// return 999999999;
// }
int min_ludzie(int lewo, int prawo, int wymagane)
{
if (wymagane == 0)
return 0;
for (int b = 1; b < 190; b++)
{
int b3 = (b * (b - 1) * (b - 2)) / 6;
int b2 = (b * (b - 1)) / 2;
int c = prawo - b;
if (b3 + lewo * c * b + (lewo + c) * b2 >= wymagane)
{
return b;
}
}
return 999999999;
}
bool min_ludzie_last(int lewo, int b, int wymagane)
{
int b3 = (b * (b - 1) * (b - 2)) / 6;
int b2 = (b * (b - 1)) / 2;
if (b3 + lewo * b2 >= wymagane)
{
return true;
}
return false;
}
int odp(int n, vector<int> &v)
{
int guess_min = 0;
int guess_max = 190 * n;
while (guess_min < guess_max)
{
int guess = (guess_min + guess_max) / 2;
int lewo = 0;
for (int i = 0; i < n - 1; i++)
{
// wez minimum dla v[i]
if (lewo > guess)
{
break;
}
int wez = min_ludzie(lewo, guess - lewo, v[i]);
// cerr << i << "BIORE " << wez << "bo guess = " << guess << "lewo=" << lewo << "prawo=" << guess - lewo << endl;
lewo += wez;
}
if (lewo <= guess && min_ludzie_last(lewo, guess - lewo, v[n - 1]))
{
guess_max = guess;
}
else
{
guess_min = guess + 1;
}
}
return guess_min;
}
int32_t main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while (T--)
{
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++)
{
int a;
cin >> a;
v[i] = a;
}
int odp1 = odp(n, v);
reverse(v.begin(), v.end());
int odp2 = odp(n, v);
cout << min(odp1, odp2) << endl;
}
}
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 115 116 117 118 119 120 121 122 123 124 125 | #include <bits/stdc++.h> // #pragma GCC optimize("Ofast") // #pragma GCC target("avx,avx2") #define int long long using namespace std; // int min_ludzie(int lewo, int prawo, int wymagane) // { // if (wymagane == 0) // return 0; // for (int biore = 1; biore < 190; biore++) // { // for (int dokladam = 0; dokladam <= biore; dokladam++) // { // int b = biore - dokladam; // int b3 = (b * (b - 1) * (b - 2)) / 6; // int b2 = (b * (b - 1)) / 2; // int c = prawo - b; // int a = lewo + dokladam; // if (b3 + a * c * b + (a + c) * b2 >= wymagane) // { // return biore; // } // } // } // return 999999999; // } int min_ludzie(int lewo, int prawo, int wymagane) { if (wymagane == 0) return 0; for (int b = 1; b < 190; b++) { int b3 = (b * (b - 1) * (b - 2)) / 6; int b2 = (b * (b - 1)) / 2; int c = prawo - b; if (b3 + lewo * c * b + (lewo + c) * b2 >= wymagane) { return b; } } return 999999999; } bool min_ludzie_last(int lewo, int b, int wymagane) { int b3 = (b * (b - 1) * (b - 2)) / 6; int b2 = (b * (b - 1)) / 2; if (b3 + lewo * b2 >= wymagane) { return true; } return false; } int odp(int n, vector<int> &v) { int guess_min = 0; int guess_max = 190 * n; while (guess_min < guess_max) { int guess = (guess_min + guess_max) / 2; int lewo = 0; for (int i = 0; i < n - 1; i++) { // wez minimum dla v[i] if (lewo > guess) { break; } int wez = min_ludzie(lewo, guess - lewo, v[i]); // cerr << i << "BIORE " << wez << "bo guess = " << guess << "lewo=" << lewo << "prawo=" << guess - lewo << endl; lewo += wez; } if (lewo <= guess && min_ludzie_last(lewo, guess - lewo, v[n - 1])) { guess_max = guess; } else { guess_min = guess + 1; } } return guess_min; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T; cin >> T; while (T--) { int n; cin >> n; vector<int> v(n); for (int i = 0; i < n; i++) { int a; cin >> a; v[i] = a; } int odp1 = odp(n, v); reverse(v.begin(), v.end()); int odp2 = odp(n, v); cout << min(odp1, odp2) << endl; } } |
English