Submission #831801

#TimeUsernameProblemLanguageResultExecution timeMemory
831801serifefedartarPalembang Bridges (APIO15_bridge)C++17
100 / 100
250 ms12704 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define fast ios::sync_with_stdio(0);cin.tie(0);
typedef long long ll;
#define f first
#define s second
#define MOD 1000000007
#define LOGN 18
#define MAXN 200005

vector<pair<ll,ll>> seq;
int main() {
	fast
	ll K, N;
	cin >> K >> N;

	ll sum = 0;
	for (int i = 0; i < N; i++) {
		char ch1, ch2;
		ll posR1, posR2;
		cin >> ch1 >> posR1 >> ch2 >> posR2;

		if (ch1 == ch2)
			sum += abs(posR1 - posR2);
		else
			seq.push_back({min(posR1, posR2), max(posR1, posR2)});
	}
	sort(seq.begin(), seq.end(), [&](pair<ll,ll> &a, pair<ll,ll> &b) {
		return a.f + a.s < b.f + b.s;
	});
	sum += seq.size();
	int n = seq.size();

	if (seq.size() == 0) {
		cout << sum << "\n";
		return 0;
	}

	ll ans = 1e15;
	vector<ll> pref(n+1, 0);
	multiset<int> s1, s2;
	ll sum1 = 0, sum2 = 0;
	for (int i = 0; i < n; i++) {
		s1.insert(seq[i].f);
		s2.insert(seq[i].s);
		sum1 += seq[i].f;
		sum2 += seq[i].s;

		while (*(s2.begin()) < *(--s1.end())) {
			s1.insert(*s2.begin());
			sum1 += *s2.begin();
			sum2 -= *s2.begin();
			s2.erase(s2.begin()); 
			s2.insert(*(--s1.end()));
			sum1 -= *(--s1.end());
			sum2 += *(--s1.end());
			s1.erase(s1.find(*(--s1.end())));
		}
		pref[i] = sum2 - sum1;
	}
	ans = pref[n-1];

	s1 = multiset<int>();
	s2 = multiset<int>();
	sum1 = sum2 = 0;
	if (K == 2) {
		for (int i = n-1; i >= 1; i--) {
			s1.insert(seq[i].f);
			s2.insert(seq[i].s);
			sum1 += seq[i].f;
			sum2 += seq[i].s;

			while (*(s2.begin()) < *(--s1.end())) {
				s1.insert(*s2.begin());
				sum1 += *s2.begin();
				sum2 -= *s2.begin();
				s2.erase(s2.begin()); 
				s2.insert(*(--s1.end()));
				sum1 -= *(--s1.end());
				sum2 += *(--s1.end());
				s1.erase(s1.find(*(--s1.end())));
			}
			ll now = sum2 - sum1;	
		
			ans = min(ans, now + pref[i-1]);		
		}
	}

	cout << sum + ans << "\n";
}
#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...