Submission #882681

#TimeUsernameProblemLanguageResultExecution timeMemory
882681vjudge1Palembang Bridges (APIO15_bridge)C++17
22 / 100
36 ms4440 KiB
#include <bits/stdc++.h>
#define fast cin.tie(0)->sync_with_stdio(0);
#define int long long
#define inf ((int)1e18)
using namespace std;

void solvek2(){
	fast
	int n;
	cin >> n;
	vector <pair<int, int> > p;
	int add_ans = 0;
	for(int i = 0; i < n; i++) {
		char fuck1, fuck2;
		int a, b;
		cin >> fuck1 >> a >> fuck2 >> b;
		if(fuck1 == fuck2) {
			add_ans += abs(a - b);
		}
		else {
			add_ans+= 1;
			p.push_back({min(a, b), max(a, b)});
		}
	}
	sort(p.begin(), p.end(), [&](const pair<int,int>&a, const pair<int,int>&b) {
		return ((double)a.first + a.second) / 2 < ((double)b.first + b.second) / 2;
	});
	int m = p.size();
	if(m == 0) {
		cout << add_ans << "\n";
		return;
	}
	int ans = inf;
	int ltans = 0, rtans = 0;
	multiset <int> l, r;
	l.insert(p[0].first);
	l.insert(p[0].second);
	ltans = p[0].second - p[0].first;
	for(int i = 1; i < m; i++) {
		r.insert(p[i].first);
		r.insert(p[i].second);
		rtans += abs(p[i].first - p[1 + m / 2].first) + abs(p[i].second - p[1 + m / 2].first);
	}
	auto lbridge = l.begin(), rbridge = r.begin();
	int rbridgeadd = m - 2;
	lbridge++;
	while(rbridgeadd--) rbridge++;
	for(int i = 1; i < m - 1; i++) {
		int a = p[i].first, b = p[i].second;
		// adjust left bridge
		l.insert(a);
		l.insert(b);
		if(a < *lbridge and b < *lbridge) { // sola kaydır
			lbridge--;
		}
		if(a > *lbridge and b > *lbridge) {
			lbridge++;
		}
		ltans += abs(*lbridge - a) + abs(*lbridge - b);
		// adjust right bridge
		r.erase(r.find(a));
		r.erase(r.find(b));
		if(a < *rbridge and b < *rbridge) { // sola kaydır
			rbridge++;
		}
		if(a > *rbridge and b > *rbridge) {
			rbridge--;
		}
		rtans -= abs(*rbridge - a) + abs(*rbridge - b);
		ans = min(ans, ltans + rtans);
	}
	cout << ans + add_ans << "\n";
}

void solvek1() {
	int n;
	cin >> n;
	vector <int> p;
	int ans = 0;
	for(int i = 0; i < n; i++) {
		char fuck1, fuck2;
		int a, b;
		cin >> fuck1 >> a >> fuck2 >> b;
		if(fuck1 == fuck2) {
			ans += abs(a - b);
		}
		else {
			ans += 1;
			p.push_back(a);
			p.push_back(b);
		}
	}
	sort(p.begin(), p.end());
	int bridge = p[p.size() / 2];
	for(auto it:p) {
		ans += abs(bridge-it);
	}
	cout << ans << "\n";
}

int32_t main() {
	fast
	int k;
	cin >> k;
	if(k == 1) {
		solvek1();
	}
	else {
		solvek2();
	}
}











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