제출 #1181278

#제출 시각아이디문제언어결과실행 시간메모리
1181278petezaPalembang Bridges (APIO15_bridge)C++20
100 / 100
96 ms5360 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; int k, q, a, b; char A, B; ll sum=0, ans=0; priority_queue<int> l; priority_queue<int, vector<int>, greater<int>> r; map<int, ll> cans; ll a1[200005], a2[200005]; void upd(int pos) { if(l.empty()) { l.push(pos); r.push(pos); return; } if(pos < l.top()) { sum += l.top()-pos; l.push(pos); l.push(pos); r.push(l.top()); l.pop(); } else if(pos > r.top()) { sum += pos-r.top(); r.push(pos); r.push(pos); l.push(r.top()); r.pop(); } else { l.push(pos); r.push(pos); } } int main() { cin.tie(0) -> sync_with_stdio(0); cin >> k >> q; vector<pair<int, pair<int, int>>> vecs; while(q--) { cin >> A >> a >> B >> b; if(a>b) swap(a, b); if(A==B) { ans += b-a; } else { ans++; vecs.emplace_back(a + b, make_pair(a, b)); } } if(vecs.empty()) {cout << ans; return 0;} sort(vecs.begin(), vecs.end()); for(int i=0;i<vecs.size();i++) { upd(vecs[i].second.first); upd(vecs[i].second.second); a1[i] = sum; } if(k == 1) {cout << sum + ans; return 0;} while(!l.empty()) l.pop(); while(!r.empty()) r.pop(); sum = 0; ll cmin = LLONG_MAX; for(int i=vecs.size()-1;i>=0;i--) { cmin = min(cmin, sum + a1[i]); upd(vecs[i].second.first); upd(vecs[i].second.second); } cout << cmin + ans; }
#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...