Submission #831777

#TimeUsernameProblemLanguageResultExecution timeMemory
831777serifefedartarPalembang Bridges (APIO15_bridge)C++17
63 / 100
2072 ms12028 KiB
#include <bits/stdc++.h> using namespace std; #define fast ios::sync_with_stdio(0);cin.tie(0); typedef long long ll; #define f first #define s second #define MOD 1000000007 #define LOGN 18 #define MAXN 200005 vector<pair<ll,ll>> seq; int main() { fast ll K, N; cin >> K >> N; ll sum = 0; for (int i = 0; i < N; i++) { char ch1, ch2; ll posR1, posR2; cin >> ch1 >> posR1 >> ch2 >> posR2; if (ch1 == ch2) sum += abs(posR1 - posR2); else seq.push_back({min(posR1, posR2), max(posR1, posR2)}); } sort(seq.begin(), seq.end(), [&](pair<int,int> a, pair<int,int> b) { return a.f + a.s < b.f + b.s; }); sum += seq.size(); if (seq.size() == 0) { cout << sum << "\n"; return 0; } multiset<int> sR1, sR2, sL1, sL2; ll sumR1 = 0, sumR2 = 0, sumL1 = 0, sumL2 = 0; for (int i = 0; i < (ll)seq.size()/2; i++) { sR1.insert(seq[i].f); sR1.insert(seq[i].s); sumR1 += seq[i].f + seq[i].s; } for (int i = (ll)seq.size()/2; i < ((ll)seq.size()/2) * 2; i++) { sR2.insert(seq[i].f); sR2.insert(seq[i].s); sumR2 += seq[i].f + seq[i].s; } if (seq.size() % 2) { sR1.insert(seq[seq.size()-1].f); sR2.insert(seq[seq.size()-1].s); sumR1 += seq[seq.size()-1].f; sumR2 += seq[seq.size()-1].s; } while (*(--sR1.end()) > *(sR2.begin())) { sR1.insert(*(sR2.begin())); sumR1 += *(sR2.begin()); sumR2 -= *(sR2.begin()); sR2.erase(sR2.begin()); sR2.insert(*(--sR1.end())); sumR2 += *(--sR1.end()); sumR1 -= *(--sR1.end()); sR1.erase(sR1.find(*(--sR1.end()))); } ll median = *(--sR1.end()); ll ans = (ll)sR1.size()*median - sumR1 + sumR2 - (ll)sR2.size()*median + sum; if (K == 2) { for (int i = 0; i < (ll)seq.size() - 1; i++) { ll val1 = seq[i].f; ll val2 = seq[i].s; if (sR1.count(val1)) { sR1.erase(sR1.find(val1)); sumR1 -= val1; } else { sR2.erase(sR2.find(val1)); sumR2 -= val1; } if (sR1.count(val2)) { sR1.erase(sR1.find(val2)); sumR1 -= val2; } else { sR2.erase(sR2.find(val2)); sumR2 -= val2; } sL1.insert(val1); sL2.insert(val2); sumL1 += val1; sumL2 += val2; while (sR1.size() > sR2.size()) { sR2.insert(*(--sR1.end())); sumR2 += *(--sR1.end()); sumR1 += *(--sR1.end()); sR1.erase(sR1.find(*(--sR1.end()))); } while (sR2.size() > sR1.size()) { sR1.insert(*(sR2.begin())); sumR1 += *(sR2.begin()); sumR2 -= *(sR2.begin()); sR2.erase(sR2.begin()); } while (sL1.size() > sL2.size()) { sL2.insert(*(--sL1.end())); sumL2 += *(--sL1.end()); sumL1 += *(--sL1.end()); sL1.erase(sL1.find(*(--sL1.end()))); } while (sL2.size() > sL1.size()) { sL1.insert(*(sL2.begin())); sumL1 += *(sL2.begin()); sumL2 -= *(sL2.begin()); sL2.erase(sL2.begin()); } while (*(--sR1.end()) > *(sR2.begin())) { sR1.insert(*(sR2.begin())); sumR1 += *(sR2.begin()); sumR2 -= *(sR2.begin()); sR2.erase(sR2.begin()); sR2.insert(*(--sR1.end())); sumR2 += *(--sR1.end()); sumR1 -= *(--sR1.end()); sR1.erase(sR1.find(*(--sR1.end()))); } while (*(--sL1.end()) > *(sL2.begin())) { sL1.insert(*(sL2.begin())); sumL1 += *(sL2.begin()); sumL2 -= *(sL2.begin()); sL2.erase(sL2.begin()); sL2.insert(*(--sL1.end())); sumL2 += *(--sL1.end()); sumL1 -= *(--sL1.end()); sL1.erase(sL1.find(*(--sL1.end()))); } ll median1 = *(--sR1.end()); ll median2 = *(--sL1.end()); ans = min(ans, (ll)sR1.size()*median1 - sumR1 + sumR2 - (ll)sR2.size()*median1 + sum + (ll)sL1.size()*median2 - sumL1 + sumL2 - (ll)sL2.size()*median2); } } cout << ans << "\n"; }
#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...