#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<b;++i)
#define FORD(i,a,b) for(int i=a;i>=b;--i)
#define PB push_back
#define EB emplace_back
#define FI first
#define SE second
#define umap unordered_map
#define uset unordered_set
#define vi vector<int>
#define vvi vector<vi>
#define vll vector<ll>
#define vvll vector<vll>
#define vpii vector<pii>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ALL(X) (X).begin(),(X).end()
#ifndef DEBUG
#define endl (char)10
#endif
using namespace std;
using ll = long long;
using ld = long double;
template <class T>
istream& operator>> (istream& is, vector<T>& vec){
FOR(i,0,vec.size()) is >> vec[i];
return is;
}
template <class T>
ostream& operator<< (ostream& os, vector<T>& vec){
for(auto& t : vec) os << t << " ";
return os;
}
template<class T, class U>
ostream& operator<< (ostream& os, const pair<T, U>& p){
os << p.FI << " " << p.SE;
return os;
}
template<class T, class U>
istream& operator>> (istream& is, pair<T, U>& p){
is >> p.FI >> p.SE;
return is;
}
vll npo3, npo2;
bool can(vll& V, ll t) {
ll p = 0;
// formula = (k po 3) + (k po 2) (t - k) + p k (t - p - k)
auto bimbda = [&p, t, &npo3, &npo2](int x){ return npo3[x] + npo2[x] * (t - x) + p * x * (t - p - x); };
FOR(i,0,V.size() - 1) {
ll b = 0, e = min(t - p + 1, (ll) npo3.size());
int bimbdab = -1;
while(b < e) {
int k = (b + e) / 2;
//cout << p << " " << t << "; " << k << " -> " << bimbda(k) << endl;
if (bimbda(k) < V[i]) b = k + 1;
else e = k;
}
if (bimbda(b) < V[i]) return false;
//cout << p << " " << t << "; " << i << "; stwierdzam " << b << endl;
p += b;
/*
int k = ranges::lower_bound(
ranges::iota_view{0, t - p + 1} | views::transform(bimbda),
(int) V[i]
);
if(bimbda(k) < V[i]) return false;
p += k;
*/
}
return t - p >= npo3.size() || bimbda(t - p) >= V.back();
}
void st() {
int n;
cin >> n;
vll V(n);
cin >> V;
ll b = 0, e = (npo3.size() - 1) * n + 1;
while(b < e) {
ll t = (b + e) / 2;
if(!can(V, t)) b = t + 1;
else e = t;
}
cout << b << endl;
}
int main () {
ios_base::sync_with_stdio(false);
cin.tie(0);
FOR(i,0,1000){
ll v = i * (i - 1) * (i - 2) / 6;
ll v2 = i * (i - 1) / 2;
npo3.PB(v);
npo2.PB(v2);
if (v > 1100000) break;
}
int t;
cin >> t;
FOR(i,0,t){
if (t < 50){
cerr << "-------------------" << endl;
}
//cout << "Case #" << i + 1 <<": ";
st();
}
}
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 | #include<bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<b;++i) #define FORD(i,a,b) for(int i=a;i>=b;--i) #define PB push_back #define EB emplace_back #define FI first #define SE second #define umap unordered_map #define uset unordered_set #define vi vector<int> #define vvi vector<vi> #define vll vector<ll> #define vvll vector<vll> #define vpii vector<pii> #define pii pair<int, int> #define pll pair<ll, ll> #define ALL(X) (X).begin(),(X).end() #ifndef DEBUG #define endl (char)10 #endif using namespace std; using ll = long long; using ld = long double; template <class T> istream& operator>> (istream& is, vector<T>& vec){ FOR(i,0,vec.size()) is >> vec[i]; return is; } template <class T> ostream& operator<< (ostream& os, vector<T>& vec){ for(auto& t : vec) os << t << " "; return os; } template<class T, class U> ostream& operator<< (ostream& os, const pair<T, U>& p){ os << p.FI << " " << p.SE; return os; } template<class T, class U> istream& operator>> (istream& is, pair<T, U>& p){ is >> p.FI >> p.SE; return is; } vll npo3, npo2; bool can(vll& V, ll t) { ll p = 0; // formula = (k po 3) + (k po 2) (t - k) + p k (t - p - k) auto bimbda = [&p, t, &npo3, &npo2](int x){ return npo3[x] + npo2[x] * (t - x) + p * x * (t - p - x); }; FOR(i,0,V.size() - 1) { ll b = 0, e = min(t - p + 1, (ll) npo3.size()); int bimbdab = -1; while(b < e) { int k = (b + e) / 2; //cout << p << " " << t << "; " << k << " -> " << bimbda(k) << endl; if (bimbda(k) < V[i]) b = k + 1; else e = k; } if (bimbda(b) < V[i]) return false; //cout << p << " " << t << "; " << i << "; stwierdzam " << b << endl; p += b; /* int k = ranges::lower_bound( ranges::iota_view{0, t - p + 1} | views::transform(bimbda), (int) V[i] ); if(bimbda(k) < V[i]) return false; p += k; */ } return t - p >= npo3.size() || bimbda(t - p) >= V.back(); } void st() { int n; cin >> n; vll V(n); cin >> V; ll b = 0, e = (npo3.size() - 1) * n + 1; while(b < e) { ll t = (b + e) / 2; if(!can(V, t)) b = t + 1; else e = t; } cout << b << endl; } int main () { ios_base::sync_with_stdio(false); cin.tie(0); FOR(i,0,1000){ ll v = i * (i - 1) * (i - 2) / 6; ll v2 = i * (i - 1) / 2; npo3.PB(v); npo2.PB(v2); if (v > 1100000) break; } int t; cin >> t; FOR(i,0,t){ if (t < 50){ cerr << "-------------------" << endl; } //cout << "Case #" << i + 1 <<": "; st(); } } |
English