Submission #584954

#TimeUsernameProblemLanguageResultExecution timeMemory
584954cologneWiring (IOI17_wiring)C++17
0 / 100
39 ms6088 KiB
#include "wiring.h"

#include <climits>
#include <algorithm>

using namespace std;

long long min_total_length(vector<int> r, vector<int> b)
{
	int N = r.size() + b.size();

	vector<pair<int, bool>> V;
	for (auto x : r)
		V.emplace_back(x, 0);
	for (auto x : b)
		V.emplace_back(x, 1);

	V.emplace_back(-1, 0);

	sort(V.begin(), V.end());

	vector<int> nT(N + 1, N + 1), nF(N + 1, N + 1);
	for (int i = N; i > 0; --i)
	{
		if (i != N)
			nT[i] = nT[i + 1], nF[i] = nF[i + 1];
		if (V[i].second)
			nT[i] = i;
		else
			nF[i] = i;
	}
	vector<long long> S(N + 1);
	for (int i = 1; i <= N; i++)
		S[i] = S[i - 1] + V[i].first;

	vector<long long> D(N + 1, LLONG_MAX / 2);
	D[0] = 0;
	for (int i = 1; i <= N; i++)
	{
		bool init = V[i].second;
		int j = init ? nF[i] : nT[i];
		if (j == N + 1)
			break;

		D[j] = min(D[j], D[i - 1] + V[j].first * (j - i) - (S[j - 1] - S[i - 1]));

		if (j == N)
			continue;

		if (V[j].second == V[j + 1].second)
		{
			int k = init ? nT[j] : nF[j];
			// i  j-1 j j+1 k-1
			// B....B R R ... R

			long long lft = V[j - 1].first * (j - i) - (S[j - 1] - S[i - 1]);
			long long rgt = S[k - 1] - S[j - 1] - V[j].first * (k - j);
			long long mid = max(j - i, k - j) * (V[j].first - V[j - 1].first);
			D[k - 1] = min(D[k - 1], D[i - 1] + lft + mid + rgt);

			if (k == N + 1)
				continue;

			long long Rgap = V[k].first - V[k - 1].first;

			// i  j-1 j j+1 k-1 k
			// B....B R R ... R B
			for (long long lw : {0, V[j].first - V[j - 1].first})
				for (long long rw : {0, V[k].first - V[k - 1].first})
				{
					int ok = j;
					int ng = k - 1;
					while (ok + 1 != ng)
					{
						int mi = (ok + ng) / 2;
						long long lcost = lw + (V[mi].first - V[j].first);
						long long rcost = rw + (V[k - 1].first - V[mi].first);
						if (lcost < rcost)
							ok = mi;
						else
							ng = mi;
					}
					// i  j-1 j j+1  ok
					// B....B R R ... R
					long long lft = V[j - 1].first * (j - i) - (S[j - 1] - S[i - 1]);
					long long rgt = S[ok - 1] - S[j - 1] - V[j].first * (ok - j);
					long long mid = max(j - i, ok - j) * (V[j].first - V[j - 1].first);
					D[ok - 1] = min(D[ok - 1], D[i - 1] + lft + mid + rgt);
				}
		}
		else
		{
			int k = init ? nF[j + 1] : nT[j + 1];

			// i  j-1 j j+1 k-1
			// B....B R B ... B
			long long lft = V[j].first * (j - i) - (S[j - 1] - S[i - 1]);
			long long rgt = (S[k - 1] - S[j - 1]) - V[j].first * (k - j);
			D[k - 1] = min(D[k - 1], D[i - 1] + lft + rgt);

			if (k == N + 1 || j + 1 == k - 1)
				continue;

			// i  j-1 j j+1 k-1 k
			// B....B R B ... B R

			for (long long lw : {0})
				for (long long rw : {0, V[k].first - V[k - 1].first})
				{
					int ok = j + 1;
					int ng = k - 1;
					while (ok + 1 != ng)
					{
						int mi = (ok + ng) / 2;
						long long lcost = lw + (V[mi].first - V[j].first);
						long long rcost = rw + (V[k - 1].first - V[mi].first);
						if (lcost < rcost)
							ok = mi;
						else
							ng = mi;
					}
					// i  j-1 j j+1  ok
					// B....B R B ... B
					long long lft = (V[j - 1].first - V[i - 1].first) - S[j] * (j - i);
					long long rgt = (V[ok - 1].first - V[j - 1].first) - S[j];
					D[ok - 1] = min(D[ok - 1], D[i - 1] + lft + rgt);
				}
		}
	}

	return D.back();
}

Compilation message (stderr)

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:64:14: warning: unused variable 'Rgap' [-Wunused-variable]
   64 |    long long Rgap = V[k].first - V[k - 1].first;
      |              ^~~~
#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...