#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 7;
long long int t, n, p, k, sr, zaczy, koncz, tyle, x, tak, moze;
long long int tab[maxn];
bool solve(long long int suma_wsz) // czy da sie rozwiazac majac x graczy czy nie
{
long long int na_lewo = 0; //cout << endl; cout << endl;
for(long long int i = zaczy; i <= koncz; i++)
{
if(!tab[i]){continue;}
long long int pocz = 1; long long int kon = min(suma_wsz - na_lewo, (long long)cbrt(tab[i]*7)+10); long long int sro = (pocz+kon)/2; // ile potrzebujemy minimalnie
while(true)
{
sro = (pocz + kon)/2; x = sro;
if(kon - pocz <= 3)
{ tak = 0;
for(long long int x = pocz; x <= kon; x++)
{
if((i != zaczy) & (i != koncz))
{
tyle = ((x * (x-1)) /2) * (suma_wsz - x) + ((x * (x-1)*(x-2))/6) + x * (suma_wsz-na_lewo-x) * na_lewo;
}
else
{
tyle = ((x * (x-1)) /2) * (suma_wsz - x) + ((x * (x-1)*(x-2))/6);
}
//cout << " tyle " << tyle << " x " << x << " suma_wsz " << suma_wsz << " ktore " << i << endl;
if(tyle >= tab[i]){na_lewo += x; tak = 1; break;}
} if(tak == 0){return 0;} break;
}
if((i != zaczy) & (i != koncz))
{
tyle = ((x * (x-1)) /2) * (suma_wsz - x) + ((x * (x-1)*(x-2))/6) + x * (suma_wsz-na_lewo-x) * na_lewo;
}
else
{
tyle = ((x * (x-1)) /2) * (suma_wsz - x) + ((x * (x-1)*(x-2))/6);
}
if(tyle < tab[i]){pocz = sro;}else{kon = sro;}
}
}
return 1;
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> t;
while(t--)
{
cin >> n; zaczy = 1e10; koncz = 0;
for(long long int i = 1; i <= n; i++)
{
cin >> tab[i]; if(tab[i]){zaczy = min(zaczy, i); koncz = max(koncz, i); moze++;} // gdzie musimy rozpatrzec specjalny przypadek
}
p = 1; k = 1e12; // ile jest co najmniej i najwiecej graczy
// cout << " zaczy " << zaczy << " koncz " << koncz << endl;
// cout << " ile " << solve(8) << endl;
while(true)
{
sr = (p + k) / 2;// cout << "p " << p << " k " << k << " sr " << sr << endl;
if(k - p <= 5)
{
for(long long int i = p; i <= k; i++)
{ // cout << " i " << i << endl;
if(solve(i) == 1)
{
cout << i << '\n'; break;
}
}
break;
}
if(solve(sr) == 0) // wtedy potrzebujemy wiecej
{
p = sr;
}
else
{
k = sr;
}
}
}
}
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 | #include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 7; long long int t, n, p, k, sr, zaczy, koncz, tyle, x, tak, moze; long long int tab[maxn]; bool solve(long long int suma_wsz) // czy da sie rozwiazac majac x graczy czy nie { long long int na_lewo = 0; //cout << endl; cout << endl; for(long long int i = zaczy; i <= koncz; i++) { if(!tab[i]){continue;} long long int pocz = 1; long long int kon = min(suma_wsz - na_lewo, (long long)cbrt(tab[i]*7)+10); long long int sro = (pocz+kon)/2; // ile potrzebujemy minimalnie while(true) { sro = (pocz + kon)/2; x = sro; if(kon - pocz <= 3) { tak = 0; for(long long int x = pocz; x <= kon; x++) { if((i != zaczy) & (i != koncz)) { tyle = ((x * (x-1)) /2) * (suma_wsz - x) + ((x * (x-1)*(x-2))/6) + x * (suma_wsz-na_lewo-x) * na_lewo; } else { tyle = ((x * (x-1)) /2) * (suma_wsz - x) + ((x * (x-1)*(x-2))/6); } //cout << " tyle " << tyle << " x " << x << " suma_wsz " << suma_wsz << " ktore " << i << endl; if(tyle >= tab[i]){na_lewo += x; tak = 1; break;} } if(tak == 0){return 0;} break; } if((i != zaczy) & (i != koncz)) { tyle = ((x * (x-1)) /2) * (suma_wsz - x) + ((x * (x-1)*(x-2))/6) + x * (suma_wsz-na_lewo-x) * na_lewo; } else { tyle = ((x * (x-1)) /2) * (suma_wsz - x) + ((x * (x-1)*(x-2))/6); } if(tyle < tab[i]){pocz = sro;}else{kon = sro;} } } return 1; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> t; while(t--) { cin >> n; zaczy = 1e10; koncz = 0; for(long long int i = 1; i <= n; i++) { cin >> tab[i]; if(tab[i]){zaczy = min(zaczy, i); koncz = max(koncz, i); moze++;} // gdzie musimy rozpatrzec specjalny przypadek } p = 1; k = 1e12; // ile jest co najmniej i najwiecej graczy // cout << " zaczy " << zaczy << " koncz " << koncz << endl; // cout << " ile " << solve(8) << endl; while(true) { sr = (p + k) / 2;// cout << "p " << p << " k " << k << " sr " << sr << endl; if(k - p <= 5) { for(long long int i = p; i <= k; i++) { // cout << " i " << i << endl; if(solve(i) == 1) { cout << i << '\n'; break; } } break; } if(solve(sr) == 0) // wtedy potrzebujemy wiecej { p = sr; } else { k = sr; } } } } |
English