Submission #925080

#TimeUsernameProblemLanguageResultExecution timeMemory
925080belgianbotPalembang Bridges (APIO15_bridge)C++14
100 / 100
130 ms9400 KiB
#include <bits/stdc++.h> #define int long long #define sz(x) (long long)(x.size()) using namespace std; struct traj{ int l, r; long double mid; }; vector <traj> a; signed main() { int K, N; cin >> K >> N; int ans(0); for (int i(0); i < N; i++) { char riv1, riv2; int pos1, pos2; cin >> riv1 >> pos1 >> riv2 >> pos2; if (pos2 < pos1) swap(pos1, pos2); if (riv1 != riv2) { ans++; a.push_back ({pos1, pos2, (long double)( (pos1 + pos2) / 2)}); } else ans += pos2 - pos1; } if (sz(a) == 0){ cout << ans << '\n'; return 0; } sort (a.begin(), a.end(), [](traj &A, traj &B){return A.mid < B.mid;}); priority_queue <int> gaucheoudroitejesaisplus; priority_queue <int, vector<int>, greater <int>> droiteougauchejesaisplus; vector <int> pleindepointtropcool (sz(a)), pleindepointtropcool2 (sz(a)); int letrucdumilieu = a[0].l; gaucheoudroitejesaisplus.push(a[0].l); droiteougauchejesaisplus.push(a[0].r); pleindepointtropcool[0] = a[0].r - a[0].l; for (int i(1); i < sz(a); i++) { pleindepointtropcool[i] = pleindepointtropcool[i - 1] + abs(a[i].l - letrucdumilieu) + abs(a[i].r - letrucdumilieu); if (a[i].l > gaucheoudroitejesaisplus.top()) droiteougauchejesaisplus.push(a[i].l); else gaucheoudroitejesaisplus.push(a[i].l); if (a[i].r <= gaucheoudroitejesaisplus.top()) gaucheoudroitejesaisplus.push(a[i].r); else droiteougauchejesaisplus.push(a[i].r); int szL = sz(gaucheoudroitejesaisplus), szR = sz(droiteougauchejesaisplus); while (gaucheoudroitejesaisplus.size() > droiteougauchejesaisplus.size()) { droiteougauchejesaisplus.push(gaucheoudroitejesaisplus.top()); gaucheoudroitejesaisplus.pop(); } while (gaucheoudroitejesaisplus.size() < droiteougauchejesaisplus.size()) { gaucheoudroitejesaisplus.push(droiteougauchejesaisplus.top()); droiteougauchejesaisplus.pop(); } int newletrucdumilieu = gaucheoudroitejesaisplus.top(); if (newletrucdumilieu > letrucdumilieu) { pleindepointtropcool[i] += szL * (newletrucdumilieu - letrucdumilieu); pleindepointtropcool[i] -= szR * (newletrucdumilieu - letrucdumilieu); } else { pleindepointtropcool[i] -= (szL -1) * (letrucdumilieu - newletrucdumilieu); pleindepointtropcool[i] += (szR + 1) * (letrucdumilieu - newletrucdumilieu); } letrucdumilieu = newletrucdumilieu; } if (K == 1) { cout << ans + pleindepointtropcool[sz(a) - 1] << '\n'; return 0; } while (!gaucheoudroitejesaisplus.empty()) gaucheoudroitejesaisplus.pop(); while(!droiteougauchejesaisplus.empty()) droiteougauchejesaisplus.pop(); letrucdumilieu = a[sz(a) - 1].l; gaucheoudroitejesaisplus.push(a[sz(a) - 1].l); droiteougauchejesaisplus.push(a[sz(a) - 1].r); pleindepointtropcool2[sz(a) - 1] = (a[sz(a) - 1].r - letrucdumilieu); int best = min(pleindepointtropcool[sz(a) - 1], pleindepointtropcool[sz(a) - 2] + pleindepointtropcool2[sz(a) - 1]); for (int i(sz(a) - 2); i > 0; i--) { pleindepointtropcool2[i] = pleindepointtropcool2[i + 1] + abs(a[i].l - letrucdumilieu) + abs(a[i].r - letrucdumilieu); if (a[i].l > gaucheoudroitejesaisplus.top()) droiteougauchejesaisplus.push(a[i].l); else gaucheoudroitejesaisplus.push(a[i].l); if (a[i].r <= gaucheoudroitejesaisplus.top()) gaucheoudroitejesaisplus.push(a[i].r); else droiteougauchejesaisplus.push(a[i].r); int szL = sz(gaucheoudroitejesaisplus), szR = sz(droiteougauchejesaisplus); while (gaucheoudroitejesaisplus.size() > droiteougauchejesaisplus.size()) { droiteougauchejesaisplus.push(gaucheoudroitejesaisplus.top()); gaucheoudroitejesaisplus.pop(); } while (gaucheoudroitejesaisplus.size() < droiteougauchejesaisplus.size()) { gaucheoudroitejesaisplus.push(droiteougauchejesaisplus.top()); droiteougauchejesaisplus.pop(); } int newletrucdumilieu = gaucheoudroitejesaisplus.top(); if (newletrucdumilieu > letrucdumilieu) { pleindepointtropcool2[i] += szL * (newletrucdumilieu - letrucdumilieu); pleindepointtropcool2[i] -= szR * (newletrucdumilieu - letrucdumilieu); } else { pleindepointtropcool2[i] -= (szL - 1) * (letrucdumilieu - newletrucdumilieu); pleindepointtropcool2[i] += (szR + 1) * (letrucdumilieu - newletrucdumilieu); } letrucdumilieu = newletrucdumilieu; best = min(best, pleindepointtropcool[i - 1] + pleindepointtropcool2[i]); } cout << best + ans << '\n'; return 0; }
#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...