#include <bits/stdc++.h>
#define mn 200009
#define ull unsigned long long
#define ll long long
#define int long long
using namespace std;
int t, n;
ll tab[mn];
// const int seed {static_cast<int>(std::chrono::high_resolution_clock::now().time_since_epoch().count())};
// mt19937 rng {seed};
ll cunt(int s, int e, int x){
// max ilosc gier w i
ll res=0;
if(s>=3) res+=(ll)(s*(s-1)*(s-2))/6;
if(s>=2) res+=(ll)(s*(s-1)/2)*(x-s);
res+=(ll)s*e*(x-e-s);
return res;
}
bool valid(int m){
int s=0;
for(int i=0; i<n; ++i){
int l=0, r=m-s, best=-1;
while(l<=r){
int mid=(l+r)/2;
ll val=cunt(mid, s, m);
if(val>=tab[i]){ best=mid; r=mid-1; }
else l=mid+1;
}
if(best==-1) return false;
// nie ma takiego co spełnia
s+=best;
if(s>m) return false;
// suma przekracza całkowitą sume
}
return true;
}
ll dwu(int m){
return (ll)m*(m-1)*(m-2)/6;
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>t;
// for(ull i=3; i<=mn-9; ++i){
// //dwu[i]=(tab[i])/(6*(tab[i-3]));
// dwu[i]=(i*(i-1)*(i-2))/6;
// //cout<<dwu[i]<<", ";
// }
while(t--){
cin>>n;
ll sum=0;
for(int i=0; i<n; ++i){ cin>>tab[i]; sum+=tab[i]; }
int l=3, r=3;
while(dwu(r)<sum) r*=2;
r*=64;
int wyn=r;
while(l<=r){
int mid=(l+r)/2;
if(dwu(mid)<sum){ l=mid+1; continue; }
if(valid(mid)){ wyn=mid; r=mid-1; }
else l=mid+1;
}
//if(valid(wyn-1)) while(valid(wyn-1)) --wyn;
// if(!valid(wyn)){
// l=wyn+1; r=mn-8;
// int mid=(l+r)/2;
// if(dwu(mid)<sum){ l=mid+1; continue; }
// if(valid(mid)){ wyn=mid; r=mid-1; }
// else l=mid+1;
// }
//while(!valid(wyn)) ++wyn;
// int los=rng()%17;
// if(los==1) --wyn;
cout<<wyn<<"\n";
}
}
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 | #include <bits/stdc++.h> #define mn 200009 #define ull unsigned long long #define ll long long #define int long long using namespace std; int t, n; ll tab[mn]; // const int seed {static_cast<int>(std::chrono::high_resolution_clock::now().time_since_epoch().count())}; // mt19937 rng {seed}; ll cunt(int s, int e, int x){ // max ilosc gier w i ll res=0; if(s>=3) res+=(ll)(s*(s-1)*(s-2))/6; if(s>=2) res+=(ll)(s*(s-1)/2)*(x-s); res+=(ll)s*e*(x-e-s); return res; } bool valid(int m){ int s=0; for(int i=0; i<n; ++i){ int l=0, r=m-s, best=-1; while(l<=r){ int mid=(l+r)/2; ll val=cunt(mid, s, m); if(val>=tab[i]){ best=mid; r=mid-1; } else l=mid+1; } if(best==-1) return false; // nie ma takiego co spełnia s+=best; if(s>m) return false; // suma przekracza całkowitą sume } return true; } ll dwu(int m){ return (ll)m*(m-1)*(m-2)/6; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>t; // for(ull i=3; i<=mn-9; ++i){ // //dwu[i]=(tab[i])/(6*(tab[i-3])); // dwu[i]=(i*(i-1)*(i-2))/6; // //cout<<dwu[i]<<", "; // } while(t--){ cin>>n; ll sum=0; for(int i=0; i<n; ++i){ cin>>tab[i]; sum+=tab[i]; } int l=3, r=3; while(dwu(r)<sum) r*=2; r*=64; int wyn=r; while(l<=r){ int mid=(l+r)/2; if(dwu(mid)<sum){ l=mid+1; continue; } if(valid(mid)){ wyn=mid; r=mid-1; } else l=mid+1; } //if(valid(wyn-1)) while(valid(wyn-1)) --wyn; // if(!valid(wyn)){ // l=wyn+1; r=mn-8; // int mid=(l+r)/2; // if(dwu(mid)<sum){ l=mid+1; continue; } // if(valid(mid)){ wyn=mid; r=mid-1; } // else l=mid+1; // } //while(!valid(wyn)) ++wyn; // int los=rng()%17; // if(los==1) --wyn; cout<<wyn<<"\n"; } } |
English