Submission #1184960

#TimeUsernameProblemLanguageResultExecution timeMemory
1184960hamzabcWiring (IOI17_wiring)C++20
100 / 100
27 ms7356 KiB
#include "wiring.h"
#include <bits/stdc++.h>


using namespace std;


long long min_total_length(std::vector<int> r, std::vector<int> b) {
	int Nr = r.size();
	int Nb = b.size();
	std::priority_queue<long long, vector<long long>, greater<>> prB, prR;
	vector<pair<int, bool>> C(Nr + Nb);  // is blue;
	vector<long long> Cclose(Nr + Nb);
	int j = 0;
	for (int i = 0; i < Nr + Nb; i++){
		if (j == Nr){
			C[i].first = b[i - j];
			C[i].second = true;
		}else if (i - j == Nb){
			C[i].first = r[j];
			C[i].second = false;
			j++;
		}else if (b[i - j] < r[j]){
			C[i].first = b[i - j];
			C[i].second = true;
		}else{
			C[i].first = r[j];
			C[i].second = false;
			j++;
		}
	}
	j = 0;
	for (int i = 0; i < Nr + Nb; i++){
		if ((i - j != Nr) && (j == Nb || r[i - j] < b[j])){
			if (j && j < Nb){
				Cclose[i] = min(b[j] - r[i - j], r[i - j] - b[j - 1]);
			}else if (j){
				Cclose[i] = r[i - j] - b[j - 1];
			}else{
				Cclose[i] = b[j] - r[i - j];
			}
		}else{
			if (i - j && i - j < Nr){
				Cclose[i] = min(r[i - j] - b[j], b[j] - r[i - j - 1]);
			}else if (i - j){
				Cclose[i] = b[j] - r[i - j - 1];
			}else{
				Cclose[i] = r[i - j] - b[j];
			}
			j++;
		}
	}
	long long int sum = 0;
	for (int i = 0; i < Nr + Nb; i++){
		if (C[i].second){
			if (prR.size() == 0 || Cclose[i] < C[i].first + prR.top()){
				prB.push(-Cclose[i] - C[i].first);
				sum += Cclose[i];
			}else{
				long long int a = prR.top();
				prR.pop();
				sum += C[i].first + a;
				prB.push(-2 * C[i].first - a);
			}
		}else{
			if (prB.size() == 0 || Cclose[i] < C[i].first + prB.top()){
				prR.push(-Cclose[i] - C[i].first);
				sum += Cclose[i];
			}else{
				long long int a = prB.top();
				prB.pop();
				sum += C[i].first + a;
				prR.push(-2 * C[i].first - a);
			}
		}
	}
	return sum;
}
#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...