제출 #1180996

#제출 시각아이디문제언어결과실행 시간메모리
1180996petezaPalembang Bridges (APIO15_bridge)C++20
22 / 100
153 ms19632 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, vector<int>> mp;
map<int, ll> cans;

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;
	while(q--) {
		cin >> A >> a >> B >> b;
		if(a>b) swap(a, b);
		if(A==B) {
			ans += b-a;
		} else {
			ans++;
			mp[a].push_back(b);
		}
	}
	ll minminmin = 0;
	vector<int> revmap;
	for(auto &e:mp) {
		revmap.push_back(e.first);
		for(auto &E:e.second) {
			upd(e.first);
			upd(E);
		}
		cans[e.first] = sum;
		minminmin = sum;
	}
	reverse(revmap.begin(), revmap.end());
	sum=0;
	while(!l.empty()) l.pop();
	while(!r.empty()) r.pop();
	for(auto &e:revmap) {
		auto &vec = mp[e];
		if(k==2) minminmin = min(minminmin, cans[e]+sum);
		for(auto &E:vec) {
			upd(e);
			upd(E);
		}
	}
	cout << ans+minminmin;
}
#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...