Submission #1281460

#TimeUsernameProblemLanguageResultExecution timeMemory
1281460Jawad_Akbar_JJPalembang Bridges (APIO15_bridge)C++20
22 / 100
94 ms5668 KiB
#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;
#define int long long
const int N = 100005, K = 700;
priority_queue<int> pQ, dm1;
priority_queue<int, vector<int>, greater<int>> Pq, dm2;
int Sum1, Sum2, pre[N];

int insert(int l, int r){
	pQ.push(l);
	Pq.push(r);
	Sum2 += r, Sum1 += l;

	while (Pq.top() < pQ.top()){
		int k1 = pQ.top(), k2 = Pq.top();
		pQ.pop(), Pq.pop();
		Sum1 += -k1 + k2, Sum2 += -k2 + k1;
		Pq.push(k1), pQ.push(k2);
	}
	return Sum2 - Sum1;
}

signed main(){
	int k, n, Ans = 0, Ans1 = 1e17;
	cin>>k>>n;

	vector<pair<int,int>> vec;
	for (int i=1;i<=n;i++){
		char a, c;
		int b, d;
		cin>>a>>b>>c>>d;
		if (b >= d)
			swap(b, d);

		if (a == c)
			Ans += d - b;
		else{
			vec.push_back({b + d, b});
			Ans++;
		}
	}

	sort(begin(vec), end(vec));

	n = vec.size();

	for (int i=0;i<n;i++)
		pre[i] = insert(vec[i].second, vec[i].first - vec[i].second);
	
	if (k == 1)
		return cout<<pre[n-1] + Ans<<'\n', 0;

	pQ = dm1;
	Pq = dm2;
	Sum1 = Sum2 = 0;

	for (int i=n-1;i>=0;i--)
		Ans1 = min(Ans1, Ans + insert(vec[i].second, vec[i].first - vec[i].second) + (i == 0 ? 0 : pre[i-1]));
	cout<<Ans1<<endl;
}
#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...