Submission #288833

#TimeUsernameProblemLanguageResultExecution timeMemory
288833luciocfWiring (IOI17_wiring)C++14
20 / 100
34 ms2040 KiB
#include <bits/stdc++.h>
#include "wiring.h"
 
#define ff first
#define ss second
 
using namespace std;
 
typedef pair<int, int> pii;
typedef long long ll;
 
const int maxn = 210;
const ll inf = 1e18+10;
 
int n, m;
 
ll dp[maxn][maxn];

int r[maxn], b[maxn];
 
ll solve(int i, int j)
{
	if ((i > n && j <= m) || (i <= n && j > m)) return inf;
	if (i == n+1 && j == m+1) return 0;
	if (dp[i][j] != -1) return dp[i][j];

	return dp[i][j] = abs(r[i]-b[j]) + min({solve(i+1, j), solve(i, j+1), solve(i+1, j+1)});
}
 
ll min_total_length(vector<int> R, vector<int> B)
{
	n = R.size(), m = B.size();
 
	if (n <= 200 && m <= 200)
	{
		for (int i = 0; i < n; i++)
			r[i+1] = R[i];
		for (int i = 0; i < m; i++)
			b[i+1] = B[i];
		
		memset(dp, -1, sizeof dp);
		return solve(1, 1);
	}
 
	ll ans = 0;
 
	if (m > n)
	{
		for (int i = m-1; i >= n; i--)
			ans += 1ll*(B[i]-R[n-1]);
 
		for (int i = n-1; i >= 0; i--)
			ans += 1ll*(B[i]-R[i]);
	}
	else if (m < n)
	{
		for (int i = 0; i < n-m; i++)
			ans += 1ll*(B[0]-R[i]);
 
		for (int i = n-m; i < n; i++)
			ans += 1ll*(B[i-(n-m)]-R[i]);
	}
	else
	{
		for (int i = 0; i < n; i++)
			ans += 1ll*(B[i]-R[i]);
	}
 
	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...