#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; } } } } |