제출 #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...