Submission #1049158

#TimeUsernameProblemLanguageResultExecution timeMemory
1049158ZicrusOvertaking (IOI23_overtaking)C++17
100 / 100
1781 ms74436 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...