이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 upperSum, lowerSum;
public:
twoPitchers() { // O(1)
upperSum = 0;
lowerSum = 0;
}
void upd(const T& val) { // O(log(n))
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;
}
} else {
upper.push(val);
upperSum += val;
if (upper.size() > lower.size()) {
med = upper.top();
lower.push(med);
lowerSum += med;
upper.pop();
upperSum -= med;
}
}
}
T qry() { // O(log(n))
T med = lower.top();
T lowerDist = med * lower.size() - lowerSum;
T upperDist = upperSum - med * upper.size();
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |