Submission #925320

#TimeUsernameProblemLanguageResultExecution timeMemory
925320belgianbotPalembang Bridges (APIO15_bridge)C++14
100 / 100
69 ms10196 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() { ios::sync_with_stdio(false); cin.tie(0); 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> left; priority_queue <int, vector<int>, greater <int>> right; vector <int> score (sz(a)), score2 (sz(a)); int median = a[0].l; left.push(a[0].l); right.push(a[0].r); score[0] = a[0].r - a[0].l; for (int i(1); i < sz(a); i++) { score[i] = score[i - 1] + abs(a[i].l - median) + abs(a[i].r - median); if (a[i].l > left.top()) right.push(a[i].l); else left.push(a[i].l); if (a[i].r <= left.top()) left.push(a[i].r); else right.push(a[i].r); int szL = sz(left), szR = sz(right); while (left.size() > right.size()) { right.push(left.top()); left.pop(); } while (left.size() < right.size()) { left.push(right.top()); right.pop(); } int newmedian = left.top(); if (newmedian > median) { score[i] += szL * (newmedian - median); score[i] -= szR * (newmedian - median); } else { score[i] -= (szL -1) * (median - newmedian); score[i] += (szR + 1) * (median - newmedian); } median = newmedian; } if (K == 1) { cout << ans + score[sz(a) - 1] << '\n'; return 0; } while (!left.empty()) left.pop(); while(!right.empty()) right.pop(); median = a[sz(a) - 1].l; left.push(a[sz(a) - 1].l); right.push(a[sz(a) - 1].r); score2[sz(a) - 1] = (a[sz(a) - 1].r - median); int best = min(score[sz(a) - 1], score[sz(a) - 2] + score2[sz(a) - 1]); for (int i(sz(a) - 2); i > 0; i--) { score2[i] = score2[i + 1] + abs(a[i].l - median) + abs(a[i].r - median); if (a[i].l > left.top()) right.push(a[i].l); else left.push(a[i].l); if (a[i].r <= left.top()) left.push(a[i].r); else right.push(a[i].r); int szL = sz(left), szR = sz(right); while (left.size() > right.size()) { right.push(left.top()); left.pop(); } while (left.size() < right.size()) { left.push(right.top()); right.pop(); } int newmedian = left.top(); if (newmedian > median) { score2[i] += szL * (newmedian - median); score2[i] -= szR * (newmedian - median); } else { score2[i] -= (szL - 1) * (median - newmedian); score2[i] += (szR + 1) * (median - newmedian); } median = newmedian; best = min(best, score[i - 1] + score2[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...