제출 #1365642

#제출 시각아이디문제언어결과실행 시간메모리
1365642Charizard2021전선 연결 (IOI17_wiring)C++20
7 / 100
19 ms5720 KiB
#include<bits/stdc++.h>
#include "wiring.h"
using namespace std;
long long min_total_length(vector<int32_t> r, vector<int32_t> b) {
	vector<vector<long long> > a;
	a.push_back({0});
	vector<long long> cur;
	long long j1 = 0;
	long long j2 = 0;
	while(j1 < r.size() || j2 < b.size()){
		if(j1 >= r.size() || (j2 < b.size() && b[j2] < r[j1])){
			swap(j1, j2);
			swap(r, b);
			if(!cur.empty()){
				a.push_back(cur);
			}
			cur.clear();
		}
		cur.push_back(r[j1]);
		j1++;
	}
	a.push_back(cur);
	a.push_back({2000000000});
	vector<long long> dp1(1, 0);
	vector<long long> dp2(1, 0);
	for(long long i = 1; i < a.size() - 1; i++){
		long long s = a[i].size();
		vector<long long> dp(s + 1, 1e18);
		long long e = 1e18;
		long long f = 0;
		for(long long j = 1; j <= s; j++){
			if(dp1.size() > j){
				e = min(e , dp1[j]);
			}
			f += a[i][j - 1] - a[i - 1].back();
			dp[j] = min(e + f, (long long)1e18);
		}
		e = 1e18;
		f = 0;
		for(long long j = dp2.size() - 1; j > s; j--){
			e = min(e, dp2[j]);
		}
		for(long long j = 1; j <= s; j++){
			f += a[i][s - j] - a[i][0];
		}
		for(long long j = s; j >= 1; j--){
			if(dp2.size() > j){
				e = min(e, dp2[j]);
			}
			dp[j] = min(e + f, dp[j]);
			f -= a[i][j - 1] - a[i][0];
		}
		dp[0] = min(dp1[0] , dp2[0]);
		dp1.assign(s + 1, 0);
		dp2.assign(s + 1, 0);
		long long w1 = 0;
		long long w2 = 0;
		long long cur = 1e9;
		for(long long j = 0; j <= s; j++){
			cur = min(cur, dp[s - j]);
			dp1[j] = min(cur + w1, (long long)1e9);
			dp2[j] = min(cur + w2, (long long)1e9);
			if(j != s){
				w1 += a[i][s - 1] - a[i][s - j - 1];
			}
			if(j != s){
				w2 += a[i + 1][0] - a[i][s - j - 1];
			}
		}
	}
	return dp1[0];
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…