Submission #1321370

#TimeUsernameProblemLanguageResultExecution timeMemory
1321370kasamchiWiring (IOI17_wiring)C++20
17 / 100
1096 ms9144 KiB
#include "wiring.h"
#include <bits/stdc++.h>
using namespace std;

long long min_total_length(vector<int> r, vector<int> b) {
	int N = r.size() + b.size();
	int ridx = 0, bidx = 0;
	vector<int> pos = {0}, col = {0};
	while (ridx < r.size() || bidx < b.size()) {
		if (bidx == b.size()) {
			pos.push_back(r[ridx]);
			col.push_back(0);
			ridx++;
		} else if (ridx == r.size()) {
			pos.push_back(b[bidx]);
			col.push_back(1);
			bidx++;
		} else if (r[ridx] < b[bidx]) {
			pos.push_back(r[ridx]);
			col.push_back(0);
			ridx++;
		} else {
			pos.push_back(b[bidx]);
			col.push_back(1);
			bidx++;
		}
	}

	vector<pair<int, int>> seg;
	for (int i = 1; i <= N; ) {
		int j = i;
		while (j <= N && col[i] == col[j]) {
			j++;
		}
		seg.push_back(make_pair(i, j - 1));
		i = j;
	}

	vector<long long> pre(N + 1);
	vector<long long> suf(N + 1);
	for (int i = 0; i < seg.size(); i++) {
		int lb = seg[i].first, rb = seg[i].second;
		for (int j = rb - 1; j >= lb; j--) {
			suf[j] = suf[j + 1] + (pos[rb] - pos[j]);
		}
		for (int j = lb + 1; j <= rb; j++) {
			pre[j] = pre[j - 1] + (pos[j] - pos[lb]);
		}
	}
	

	vector<long long> dp(N + 1, (long long)1e18);
	dp[0] = 0;
	for (int sid = 1; sid < seg.size(); sid++) {
		int clb = seg[sid].first, crb = seg[sid].second;
		int plb = seg[sid - 1].first, prb = seg[sid - 1].second;
		for (int c = clb; c <= crb; c++) {
			for (int p = plb; p <= prb; p++) {
				int psz = prb - p + 1;
				int csz = c - clb + 1;
				long long cost = 0;
				cost += suf[p] + pre[c];
				cost += (pos[clb] - pos[prb]) * max(psz, csz);
				dp[c] = min(dp[c], min(dp[p - 1], dp[p]) + cost);
				if (p == 1) {
					break;
				}
			}
		}
	}
	return dp[N];
}
#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...