Submission #536343

#TimeUsernameProblemLanguageResultExecution timeMemory
536343fcwPalembang Bridges (APIO15_bridge)C++17
100 / 100
142 ms5468 KiB
#include <bits/stdc++.h>
#define st first
#define nd second
using lint = int64_t;
constexpr int mod = int(1e9) + 7;
constexpr int inf = 0x3f3f3f3f;
constexpr int ninf = 0xcfcfcfcf;
constexpr lint linf = 0x3f3f3f3f3f3f3f3f;
const long double pi = acosl(-1.0);
// Returns -1 if a < b, 0 if a = b and 1 if a > b.
int cmp_double(double a, double b = 0, double eps = 1e-9) {
	return a + eps > b ? b + eps > a ? 0 : 1 : -1;
}
using namespace std;

using pii = pair<int, int>;
bool cmp(pii a, pii b){
	return a.st + a.nd < b.st + b.nd;
}

int main() {
	cin.tie(nullptr)->sync_with_stdio(false);
	int k, n;
	cin>>k>>n;
	vector<pii>v = {{0, 0}};
	lint bonus = 0;
	for(int i=0;i<n;i++){
		char a,b;
		int c,d;
		cin>>a>>c>>b>>d;
		if(c > d) swap(c, d);
		if(a == b) bonus += d - c;
		else{
			bonus++;
			v.push_back({c, d});
		}
	}
	sort(v.begin(), v.end(), cmp);
	n = (int)v.size();
	priority_queue<int>lpq;
	priority_queue<int, vector<int>, greater<int>>rpq;

	lint lsum = 0, rsum = 0;
	auto ins = [&](int x)->void{
		int median = (lpq.empty() ? inf : lpq.top());
		if(x <= median){
			lpq.push(x);
			lsum += x;
		}
		else{
			rpq.push(x);
			rsum += x;
		}
		if(rpq.size() < 1 + lpq.size()){
			int top = lpq.top();
			lpq.pop();
			rpq.push(top);
			lsum -= top;
			rsum += top;
		}
		if(lpq.size() < rpq.size()){
			int top = rpq.top();
			rpq.pop();
			lpq.push(top);
			lsum += top;
			rsum -= top;
		}
	};
	vector<lint>pref(n);
	for(int i=1;i<n;i++){
		ins(v[i].st);
		ins(v[i].nd);
		pref[i] = rsum - lsum;
	}
	lint ans = pref[n-1];
	if(k == 2){
		lsum = rsum = 0;
		while(!lpq.empty()) lpq.pop();
		while(!rpq.empty()) rpq.pop();
		for(int i=n-1;i;i--){
			ins(v[i].st);
			ins(v[i].nd);
			ans = min(ans, rsum - lsum + pref[i-1]);
		}
	}
	ans += bonus;
	cout<<ans<<"\n";
	return 0;
}
/*
[  ]Leu o problema certo???
[  ]Ver se precisa de long long
[  ]Viu o limite dos fors (é n? é m?)
[  ]Tamanho do vetor, será que é 2e5 em vez de 1e5??
[  ]Testar sample
[  ]Testar casos de  borda
[  ]1LL no 1LL << i
[  ]Testar mod (é 1e9+7, mesmo?, será que o mod não ficou negativo?)
*/
#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...