#include <bits/stdc++.h> using namespace std; const int N = 200004; int A[N]; int U[N]; // uzyte int ile_min_osob(int wszystkie, int uzyte, int bound) { int L = 0, R = wszystkie - uzyte + 1; while(L < R) { int M = (L+R)/2; long long mecze = (long long)M*(M-1)*(M-2)/6 + (long long)M*(M-1)/2*(wszystkie-M) + (long long)(wszystkie-M-uzyte)*M*uzyte; if(mecze < bound) L = M+1; else R = M; } if(L == wszystkie - uzyte + 1) return -1; return L; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while(t--) { int n; cin >> n; for(int i = 1; i <= n; i++) cin >> A[i]; int a = 1, b = 1000000; while(a < b) { int m = (a+b)/2; U[n+1] = 0; bool czy = true; for(int i = n; i >= 1; i--) { int obecne = ile_min_osob(m, U[i+1], A[i]); if(obecne == -1) { czy = false; break; } U[i] = obecne + U[i+1]; } if(!czy) a = m+1; else b = m; } cout << a << "\n"; } return 0; }
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 | #include <bits/stdc++.h> using namespace std; const int N = 200004; int A[N]; int U[N]; // uzyte int ile_min_osob(int wszystkie, int uzyte, int bound) { int L = 0, R = wszystkie - uzyte + 1; while(L < R) { int M = (L+R)/2; long long mecze = (long long)M*(M-1)*(M-2)/6 + (long long)M*(M-1)/2*(wszystkie-M) + (long long)(wszystkie-M-uzyte)*M*uzyte; if(mecze < bound) L = M+1; else R = M; } if(L == wszystkie - uzyte + 1) return -1; return L; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while(t--) { int n; cin >> n; for(int i = 1; i <= n; i++) cin >> A[i]; int a = 1, b = 1000000; while(a < b) { int m = (a+b)/2; U[n+1] = 0; bool czy = true; for(int i = n; i >= 1; i--) { int obecne = ile_min_osob(m, U[i+1], A[i]); if(obecne == -1) { czy = false; break; } U[i] = obecne + U[i+1]; } if(!czy) a = m+1; else b = m; } cout << a << "\n"; } return 0; } |