Submission #288806

#TimeUsernameProblemLanguageResultExecution timeMemory
288806luciocfWiring (IOI17_wiring)C++14
0 / 100
80 ms145404 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;

pii a[maxn];
ll dp[2*maxn][maxn][maxn];

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

	ll ans = inf;

	if (a[i].ss == 0)
	{
		ans = min(ans, solve(i+1, r+1, b) - 1ll*a[i].ff);
		ans = min(ans, solve(i, r+1, b) - 1ll*a[i].ff);

		if (b) ans = min(ans, 1ll*a[i].ff + solve(i+1, r, b-1));
		if (b) ans = min(ans, 1ll*a[i].ff + solve(i, r, b-1));
	}
	else
	{
		ans = min(ans, solve(i+1, r, b+1) - 1ll*a[i].ff);
		ans = min(ans, solve(i, r, b+1) - 1ll*a[i].ff);

		if (r) ans = min(ans, 1ll*a[i].ff + solve(i+1, r-1, b));
		if (r) ans = min(ans, 1ll*a[i].ff + solve(i, r-1, b));
	}

	return dp[i][r][b] = ans;
}

ll min_total_length(vector<int> r, vector<int> b)
{
	n = r.size(), m = b.size();

	if (n <= 200 && m <= 200)
	{
		int aux = 0;

		for (auto i: r)
			a[++aux] = {i, 0};

		for (auto i: b)
			a[++aux] = {i, 1};

		sort(a+1, a+n+m+1);

		memset(dp, -1, sizeof dp);
		return solve(1, 0, 0);
	}

	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...