Submission #866291

#TimeUsernameProblemLanguageResultExecution timeMemory
866291Dec0DeddPalembang Bridges (APIO15_bridge)C++14
100 / 100
130 ms13508 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pii; const int N = 1e5+10; const ll INF = 1e18; ll a[N], b[N], n, k; struct Median { priority_queue<ll> lw; priority_queue<ll, vector<ll>, greater<ll>> up; ll slw, sup; Median(): slw(0), sup(0) {} void add(int x) { if (!lw.empty() && lw.top() < x) up.push(x), sup+=x; else lw.push(x), slw+=x; while (up.size() > lw.size()) { sup-=up.top(), slw+=up.top(); lw.push(up.top()), up.pop(); } while (lw.size() > up.size()+1) { slw-=lw.top(), sup+=lw.top(); up.push(lw.top()), lw.pop(); } } ll que() { if (lw.empty()) return 0; ll vl=lw.top(); return (vl*lw.size()-slw)+(sup-vl*up.size()); } }; int main() { cin>>k>>n; ll ans=0; vector<pii> v; for (int i=1; i<=n; ++i) { string p, s; cin>>p>>a[i]>>s>>b[i]; if (p == s) { ans+=abs(a[i]-b[i]); continue; } ++ans; if (a[i] > b[i]) swap(a[i], b[i]); v.push_back({a[i]+b[i], i}); } sort(v.begin(), v.end()); if (v.empty()) { cout<<ans<<"\n"; return 0; } // k = 1 Median med; for (auto u : v) med.add(a[u.second]), med.add(b[u.second]); ll ovl=med.que(); // k = 2 if (k == 2) { ll p[n+1]={}, suf[n+1]={}, sz=v.size(); Median lf, rf; for (int j=0; j<sz; ++j) { lf.add(a[v[j].second]), lf.add(b[v[j].second]); p[j]=lf.que(); } for (int j=sz-1; j>=0; --j) { rf.add(a[v[j].second]), rf.add(b[v[j].second]); suf[j]=rf.que(); } ll g=INF; for (int j=0; j+1<sz; ++j) g=min(g, p[j]+suf[j+1]); ans+=min(ovl, g); } else ans+=ovl; 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...