Submission #1184940

#TimeUsernameProblemLanguageResultExecution timeMemory
1184940hamzabcWiring (IOI17_wiring)C++20
0 / 100
1102 ms195704 KiB
#include "wiring.h"


#include <bits/stdc++.h>


using namespace std;
int Nr, Nb;
std::vector<long long> R;
std::vector<long long> B;
std::vector<long long> Bclose;
std::vector<long long> Rclose;
vector<map<long long, int>> mem;


long long int dp(int r, int b){
	if (r == Nr && b == Nb){
		return 0;
	}
	if (mem[r][b])
		return mem[r][b];
	if (r == Nr){
		mem[r][b] = dp(r, b + 1) + Bclose[b];
		return mem[r][b];
	}
	if (b == Nb){
		mem[r][b] = dp(r + 1, b) + Bclose[r];
		return mem[r][b];
	}
	if (R[r] < B[b]){
		mem[r][b] = min(dp(r + 1, b + 1) + B[b] - R[r], dp(r + 1, b) + Rclose[r]);
	}else{
		mem[r][b] = min(dp(r + 1, b + 1) + R[r] - B[b], dp(r, b + 1) + Bclose[b]);
	}
	return mem[r][b];
}



long long min_total_length(std::vector<int> r, std::vector<int> b) {
	Nr = r.size();
	Nb = b.size();
	R.resize(Nr);
	B.resize(Nb);
	Rclose.resize(Nr);
	Bclose.resize(Nb);
	int j = 0;
	for (int i = 0; i < Nr; i++){
		R[i] = r[i];
	}
	for (int i = 0; i < Nb; i++){
		B[i] = b[i];
	}
	for (int i = 0; i < Nr + Nb; i++){
		if ((i - j != Nr) && (j == Nb || r[i - j] < b[j])){
			if (j && j < Nb){
				Rclose[i - j] = min(b[j] - r[i - j], r[i - j] - b[j - 1]);
			}else if (j){
				Rclose[i - j] = r[i - j] - b[j - 1];
			}else{
				Rclose[i - j] = b[j] - r[i - j];
			}
		}else{
			if (i - j && i - j < Nr){
				Bclose[j] = min(r[i - j] - b[j], b[j] - r[i - j - 1]);
			}else if (i - j){
				Bclose[j] = b[j] - r[i - j - 1];
			}else{
				Bclose[j] = r[i - j] - b[j];
			}
			j++;
		}
	}
	mem.resize(Nr + 1);
	return dp(0, 0);
}
#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...