제출 #401473

#제출 시각아이디문제언어결과실행 시간메모리
401473BERNARB01Palembang Bridges (APIO15_bridge)C++17
100 / 100
79 ms7004 KiB
#include <bits/stdc++.h> using namespace std; template<typename T> class twoPitchers { private: priority_queue<T> lower; priority_queue<T, vector<T>, greater<T>> upper; T lowerSum, upperSum; public: twoPitchers() { lowerSum = 0; upperSum = 0; } void upd(const T& val) { if (lower.empty()) { lower.push(val); lowerSum += val; return; } T med = lower.top(); if (val <= med) { lower.push(val); lowerSum += val; if (lower.size() > upper.size() + 1) { upper.push(med); upperSum += med; lower.pop(); lowerSum -= med; } return; } upper.push(val); upperSum += val; if (upper.size() > lower.size()) { med = upper.top(); upper.pop(); upperSum -= med; lower.push(med); lowerSum += med; } } T qry() { T med = lower.top(); T upperDist = upperSum - med * upper.size(); T lowerDist = med * lower.size() - lowerSum; return lowerDist + upperDist; } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int k, n; cin >> k >> n; if (k == 1) { long long same = 0; vector<int> pa; for (int i = 0; i < n; i++) { char z, zz; int p, pp; cin >> z >> p >> zz >> pp; if (z == zz) { same += abs(p - pp); } else { pa.push_back(p); pa.push_back(pp); } } if (!pa.empty()) { sort(pa.begin(), pa.end()); int loc = pa[pa.size() / 2]; for (int i = 0; i < (int) pa.size(); i++) { same += abs(pa[i] - loc); } same += (pa.size() / 2); } cout << same << '\n'; return 0; } long long same = 0; vector<array<int, 3>> pa; for (int i = 0; i < n; i++) { char z, zz; int p, pp; cin >> z >> p >> zz >> pp; if (z == zz) { same += abs(p - pp); } else { pa.emplace_back(array<int, 3>{p + pp, p, pp}); } } if (!pa.empty()) { n = pa.size(); sort(pa.begin(), pa.end()); twoPitchers<long long> L, R; vector<long long> costR(n); for (int i = n - 1; i >= 0; i--) { R.upd(pa[i][1]); R.upd(pa[i][2]); costR[i] = n - i + R.qry(); } long long res = costR[0]; for (int i = 0; i + 1 < n; i++) { L.upd(pa[i][1]); L.upd(pa[i][2]); res = min(res, i + 1 + L.qry() + costR[i + 1]); } same += res; } cout << same << '\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...