This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "overtaking.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
const ll NN = 2e5 + 5;
ll n, m, x;
ll a[NN], b[NN], jar[NN], sam[2020][2020];
vector<pair<ll, pll> > v[NN];
vector<ll> hai;
vector<pll> oi, oi2;
long long arrival_timee(long long Y);
void init(int L, int N, std::vector<long long> T, std::vector<int> W, int X, int M, std::vector<int> S)
{
n = N;
m = M;
x = X;
for(ll i = 0; i < n; i++)
{
a[i] = T[i];
b[i] = W[i];
// cout << a[i] << "dan" << b[i] << "ui\n";
}
for(ll i = 0; i < m; i++)
jar[i] = S[i];
for(ll i = 0; i < n; i++)
sam[0][i] = a[i];
for(ll i = 1; i < m; i++)
{
for(ll j = 0; j < n; j++)
{
v[i].pb(mp(sam[i - 1][j], mp(b[j], j)));
}
sort(v[i].begin(), v[i].end());
ll lst = 0;
for(auto z : v[i])
{
sam[i][z.se.se] = max(lst, sam[i - 1][z.se.se] + (jar[i] - jar[i - 1]) * z.se.fi);
lst = sam[i][z.se.se];
}
}
ll lst = 0;
for(ll i = 1; i <= 20000; i++)
{
ll o = arrival_timee(lst);
ll L = lst, R = 1e18, kan = lst;
while(L <= R)
{
ll C = (L + R) / 2;
if(arrival_timee(C) == o)
{
kan = C;
L = C + 1;
}
else
R = C - 1;
}
// cout << kan << " " << o << "\n";
oi.pb(mp(kan, o));
lst = kan + 1;
}
lst = 1e18;
for(ll i = 1; i <= 20000; i++)
{
ll o = arrival_timee(lst);
ll L = 0, R = lst, kir = R;
while(L <= R)
{
ll C = (L + R) / 2;
if(arrival_timee(C) == o)
{
kir = C;
R = C - 1;
}
else
L = C + 1;
}
// cout << kir << " " << o << "\n";
oi2.pb(mp(kir, o));
lst = kir - 1;
}
// for(ll i = 0; i <= 500; i++)
{
// if(i == 0 || arrival_time(i) != arrival_time(i - 1))
// cout << i << " " << arrival_time(i) << "\n";
}
return;
}
long long arrival_timee(long long Y)
{
for(ll i = 1; i < m; i++)
{
pair<ll, pll> ban = mp(Y, mp(x, n));
ll L = 0, R = v[i].size() - 1;
ll lst = -1;
while(L <= R)
{
ll C = (L + R) / 2;
if(v[i][C] < ban)
{
lst = C;
L = C + 1;
}
else
R = C - 1;
}
if(lst >= 0)
Y = max(sam[i][v[i][lst].se.se], Y + (jar[i] - jar[i - 1]) * ban.se.fi);
else
Y = Y + (jar[i] - jar[i - 1]) * ban.se.fi;
// sort(v.begin(), v.end());
// ll lst = 0;
// for(auto z : v)
// {
// // cout << "(" << i << "," << z.fi << ") " << sam[z.se.se] << " + " << (jar[i] - jar[i - 1]) << "*" << z.se.fi << "@\n";
// sam[z.se.se] = max(lst, sam[z.se.se] + (jar[i] - jar[i - 1]) * z.se.fi);
// lst = sam[z.se.se];
// }
}
return Y;
}
long long arrival_time(long long Y)
{
ll ret = -1, L = 0, R = oi.size() - 1;
while(L <= R)
{
ll C = (L + R) / 2;
if(oi[C].fi >= Y)
{
ret = oi[C].se;
R = C - 1;
}
else
L = C + 1;
}
if(ret != -1)
return ret;
L = 0, R = oi2.size() - 1;
while(L <= R)
{
ll C = (L + R) / 2;
if(oi2[C].fi <= Y)
{
ret = oi2[C].se;
L = C + 1;
}
else
R = C - 1;
}
if(ret != -1)
return ret;
return oi.back().se + Y - oi.back().fi;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |