제출 #1145354

#제출 시각아이디문제언어결과실행 시간메모리
1145354SmuggingSpun전선 연결 (IOI17_wiring)C++20
13 / 100
17 ms1864 KiB
#include "wiring.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>void minimize(T& a, T b){
	if(a > b){
		a = b;
	}
}
const ll INF = 1e18;
ll min_total_length(vector<int>r, vector<int>b){
	ll ans = 0;
	int n = r.size(), m = b.size();
	if(n > m){
		swap(n, m);
		swap(r, b);
	}
	for(int i = 0, j = 0; i < n; i++){
		ans += abs(r[i] - b[j++]);
		while(m - j >= n - i && (i + 1 == n || abs(r[i] - b[j]) < abs(r[i + 1] - b[j]))){
			ans += abs(r[i] - b[j++]);
		}
	}
	return ans;
	if(n <= 200 && m <= 200){
		vector<vector<ll>>dp(n + 1, vector<ll>(m + 1, INF));
		dp[n][m] = 0;
		for(int i = n; i > -1; i--){
			for(int j = m; j > -1; j--){
				if(i < n || j < m){
					if(i < n && j < m){
						dp[i][j] = dp[i + 1][j + 1] + abs(r[i] - b[j]);
					}
					if(i < n){
						for(int k = m - 1; k >= j; k--){
							minimize(dp[i][j], dp[i + 1][j] + abs(r[i] - b[k]));
						}
					}
					if(j < m){
						for(int k = n - 1; k >= i; k--){
							minimize(dp[i][j], dp[i][j + 1] + abs(r[k] - b[j]));
						}
					}
				}
			}
		}
		return dp[0][0];
	}
	else if(r.back() < b[0]){
		int i = n, j = m;
		while(i > 0 && j > 0){
			ans += b[--j] - r[--i];
		}
		while(i > 0){
			ans += b[0] - r[--i];
		}
		while(j > 0){
			ans += b[--j] - r.back();
		}
	}
}
#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...