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 <bits/stdc++.h>
#include "overtaking.h"
using namespace std;
typedef long long ll;
vector<vector<ll>> tCur, tNxt;
vector<ll> s;
ll x, m;
void init(int l1, int n1, vector<ll> t, vector<int> w, int x1, int m1, vector<int> s1) {
{
ll l = l1;
ll n = n1;
s = vector<ll>(s1.size());
for (ll i = 0; i < s1.size(); i++) s[i] = s1[i];
m = m1;
x = x1;
tCur = vector<vector<ll>>(m-1);
tNxt = vector<vector<ll>>(m-1);
vector<pair<ll, ll>> busses;
for (ll i = 0; i < n; i++) {
if (w[i] <= x) continue;
busses.push_back({t[i], w[i]});
}
sort(busses.begin(), busses.end());
n = busses.size();
for (ll t = 0; t < m-1; t++) {
for (ll i = 0; i < n; i++) {
ll curTime = busses[i].first;
if (t > 0) {
ll idealNxt = curTime + busses[i].second * (s[t] - s[t-1]);
auto iter = lower_bound(tCur[t-1].begin(), tCur[t-1].end(), curTime);
ll id = iter - tCur[t-1].begin();
ll mxNxt = id > 0 ? tNxt[t-1][id-1] : 0;
busses[i].first = curTime = max(idealNxt, mxNxt);
}
ll idealNxt = curTime + busses[i].second * (s[t+1] - s[t]);
auto iter = lower_bound(tCur[t].begin(), tCur[t].end(), curTime);
ll id = iter - tCur[t].begin();
ll mxNxt = id > 0 ? tNxt[t][id-1] : 0;
ll nxt = max(idealNxt, mxNxt);
if (nxt > mxNxt) {
if (id < tCur[t].size() && curTime == tCur[t][id]) {
if (nxt > tNxt[t][id]) tNxt[t][id] = nxt;
}
else {
tCur[t].insert(iter, curTime);
tNxt[t].insert(tNxt[t].begin() + id, nxt);
}
}
}
}
}
queue<ll> q, q1;
vector<ll> tmpCur, tmpNxt;
for (int t = m-3; t >= 0; t--) {
if ((t+1) % 167 == 0) continue;
tmpCur = tCur[t];
tmpNxt = tNxt[t];
tCur[t].clear(); tNxt[t].clear();
for (int i = 0; i < tmpCur.size(); i++) {
q.push(tmpCur[i]);
}
for (auto &e : tCur[t+1]) {
q1.push(e - x * (s[t+1] - s[t]));
}
ll idA = 0, idB = 0;
while (!q.empty() || !q1.empty()) {
ll curTime = 0;
if (q.empty()) {
curTime = q1.front(); q1.pop();
}
else if (q1.empty()) {
curTime = q.front(); q.pop();
}
else if (q.front() < q1.front()) {
curTime = q.front(); q.pop();
}
else {
curTime = q1.front(); q1.pop();
}
ll idealNxt = curTime + x * (s[t+1] - s[t]);
while (idA < tmpCur.size() && tmpCur[idA] <= curTime) idA++;
ll mxNxt = idA > 0 ? tmpNxt[idA-1] : 0;
ll nxt = max(idealNxt, mxNxt);
ll idealEnd = nxt + x * (s[t+2] - s[t+1]);
if (idealNxt >= mxNxt) {
while (idB < tCur[t+1].size() && tCur[t+1][idB] <= nxt) idB++;
}
else {
while (idB < tCur[t+1].size() && tCur[t+1][idB] < nxt) idB++;
}
ll mxEnd = idB > 0 ? tNxt[t+1][idB-1] : 0;
ll end = max(idealEnd, mxEnd);
ll id = tCur[t].size() - 1;
ll mxPre = tNxt[t].size() > 0 ? tNxt[t].back() : 0;
if (end > mxPre) {
if (curTime == tCur[t][id]) {
if (end > tNxt[t][id]) tNxt[t][id] = end;
}
else {
tCur[t].push_back(curTime);
tNxt[t].push_back(end);
}
}
}
tCur.erase(tCur.begin()+t+1);
tNxt.erase(tNxt.begin()+t+1);
s.erase(s.begin()+t+1);
}
}
ll arrival_time(ll y) {
for (int t = 0; t < s.size()-1; t++) {
ll idealNxt = y + x * (s[t+1] - s[t]);
ll id = lower_bound(tCur[t].begin(), tCur[t].end(), y) - tCur[t].begin();
ll mxNxt = id > 0 ? tNxt[t][id-1] : 0;
y = max(idealNxt, mxNxt);
}
return y;
}
Compilation message (stderr)
overtaking.cpp: In function 'void init(int, int, std::vector<long long int>, std::vector<int>, int, int, std::vector<int>)':
overtaking.cpp:16:26: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
16 | for (ll i = 0; i < s1.size(); i++) s[i] = s1[i];
| ~~^~~~~~~~~~~
overtaking.cpp:45:28: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
45 | if (id < tCur[t].size() && curTime == tCur[t][id]) {
| ~~~^~~~~~~~~~~~~~~~
overtaking.cpp:13:12: warning: unused variable 'l' [-Wunused-variable]
13 | ll l = l1;
| ^
overtaking.cpp:65:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
65 | for (int i = 0; i < tmpCur.size(); i++) {
| ~~^~~~~~~~~~~~~~~
overtaking.cpp:88:24: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
88 | while (idA < tmpCur.size() && tmpCur[idA] <= curTime) idA++;
| ~~~~^~~~~~~~~~~~~~~
overtaking.cpp:94:28: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
94 | while (idB < tCur[t+1].size() && tCur[t+1][idB] <= nxt) idB++;
| ~~~~^~~~~~~~~~~~~~~~~~
overtaking.cpp:97:28: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
97 | while (idB < tCur[t+1].size() && tCur[t+1][idB] < nxt) idB++;
| ~~~~^~~~~~~~~~~~~~~~~~
overtaking.cpp: In function 'll arrival_time(ll)':
overtaking.cpp:123:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
123 | for (int t = 0; t < s.size()-1; t++) {
| ~~^~~~~~~~~~~~
# | 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... |