Submission #1045168

#TimeUsernameProblemLanguageResultExecution timeMemory
1045168sssamuiPalembang Bridges (APIO15_bridge)C++17
100 / 100
181 ms14324 KiB
#include <iostream> #include <cstdio> #include <vector> #include <cmath> #include <algorithm> #include <set> using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int k, n; cin >> k >> n; LL fans = 0; vector<pair<LL, pair<LL, LL>>> inv(0); vector<LL> invnums(0); while (n--) { char a, c; LL b, d; cin >> a >> b >> c >> d; if (a == c) { if (b > d) fans += b - d; else fans += d - b; } else { fans++; invnums.push_back(b), invnums.push_back(d); inv.push_back({ b + d, {b, d} }); } } n = inv.size(); sort(invnums.begin(), invnums.end()), sort(inv.begin(), inv.end()); LL llsum = 0, lrsum = 0, rlsum = 0, rrsum = 0, lmid = -1, rmid = -1; multiset<LL> ll, lr, rl, rr; for (int i = 0; i < n; i++) { rl.insert(-invnums[i]); rlsum += invnums[i]; } for (int i = n; i < 2 * n; i++) { rr.insert(invnums[i]); rrsum += invnums[i]; } rmid = -*rl.begin(); LL ans = rrsum - rlsum; if (k == 2) for (int i = 0; i < n - 1; i++) { if (inv[i].second.first > rmid) { rrsum -= inv[i].second.first; rr.erase(rr.find(inv[i].second.first)); if (inv[i].second.second <= rmid) { rlsum -= inv[i].second.second; rl.erase(rl.find(-inv[i].second.second)); rmid = -*rl.begin(); } else { rrsum -= inv[i].second.second; rr.erase(rr.find(inv[i].second.second)); rrsum += rmid; rr.insert(rmid); rlsum -= rmid; rl.erase(rl.begin()); rmid = -*rl.begin(); } } else { rlsum -= inv[i].second.first; rl.erase(rl.find(-inv[i].second.first)); rmid = -*rl.begin(); if (inv[i].second.second > rmid) { rrsum -= inv[i].second.second; rr.erase(rr.find(inv[i].second.second)); } else { rlsum -= inv[i].second.second; rl.erase(rl.find(-inv[i].second.second)); rmid = *rr.begin(); rlsum += rmid; rl.insert(-rmid); rrsum -= rmid; rr.erase(rr.begin()); } } if (inv[i].second.first > lmid) { lr.insert(inv[i].second.first); lrsum += inv[i].second.first; if (inv[i].second.second <= lmid) { ll.insert(-inv[i].second.second); llsum += inv[i].second.second; lmid = -*ll.begin(); } else { lr.insert(inv[i].second.second); lrsum += inv[i].second.second; lmid = *lr.begin(); lrsum -= lmid; lr.erase(lr.begin()); ll.insert(-lmid); llsum += lmid; } } else { ll.insert(-inv[i].second.first); llsum += inv[i].second.first; if (inv[i].second.second >= lmid) { lrsum += inv[i].second.second; lr.insert(inv[i].second.second); } else { llsum += inv[i].second.second; ll.insert(-inv[i].second.second); lrsum += lmid; lr.insert(lmid); llsum -= lmid; ll.erase(ll.begin()); lmid = -*ll.begin(); } } ans = fmin(ans, (rrsum - rlsum) + (lrsum - llsum)); } fans += ans; cout << fans; }
#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...