제출 #1342084

#제출 시각아이디문제언어결과실행 시간메모리
1342084madamadam3전선 연결 (IOI17_wiring)C++20
13 / 100
42 ms6568 KiB
#include "wiring.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
using vi = vector<int>;

ll min_total_length(vi r, vi b) {
	set<int> red, blue;
	ll ans = 0;
	int i = 0, j = 0;

	while (i < r.size() && j < b.size()) {
		if (r[i] < b[j]) {
			if (!blue.empty()) {ans += r[i++] - *blue.begin(); blue.erase(*blue.begin());}
			else red.insert(r[i++]);
		} else {
			if (!red.empty()) {ans += b[j++] - *red.begin(); red.erase(*red.begin());}
			else blue.insert(b[j++]);
		}
	}

	while (i < r.size()) {
		if (!blue.empty()) {ans += r[i++] - *blue.begin(); blue.erase(*blue.begin());}
		else ans += r[i++] - b.back();
	}

	while (j < b.size()) {
		if (!red.empty()) {ans += b[j++] - *red.begin(); red.erase(*red.begin());}
		else ans += b[j++] - r.back();
	}

	while (!red.empty()) {
		int x = *red.begin(); red.erase(x);
		auto it = lower_bound(b.begin(), b.end(), x);

		int u = INT_MAX;
		if (it != b.end()) u = min(u, abs(*it - x));
		else if (it != b.begin()) --it, u = min(u, abs(*it - x));
		ans += u;
	}

	while (!blue.empty()) {
		int x = *blue.begin(); blue.erase(x);
		auto it = lower_bound(r.begin(), r.end(), x);

		int u = INT_MAX;
		if (it != r.end()) u = min(u, abs(*it - x));
		else if (it != r.begin()) --it, u = min(u, abs(*it - x));
		ans += u;
	}


	return ans;
}
#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...