제출 #199363

#제출 시각아이디문제언어결과실행 시간메모리
199363mythosWiring (IOI17_wiring)C++17
100 / 100
134 ms31352 KiB
#include <bits/stdc++.h>
#include "wiring.h"

using namespace std;

const int inf = 1234567890;

int n;
pair<int, int> a[1000100];
set<int> sa, sb;

int getnear(int x) {
	int res = 2e9;
	if (a[x].second == 1) {
		auto p = sa.lower_bound(a[x].first);
		if (p != sa.end()) {
			res = min(res, *p - a[x].first);
		}
		if (p != sa.begin()) {
			p--;
			res = min(res, a[x].first - *p);
		}
	}
	else {
		auto p = sb.lower_bound(a[x].first);
		if (p != sb.end()) {
			res = min(res, *p - a[x].first);
		}
		if (p != sb.begin()) {
			p--;
			res = min(res, a[x].first - *p);
		}
	}
	return res;
}

long long suma[1000100], sumb[1000100];
long long dp[1000100];
int mat[1000100], prv[2000200];

long long min_total_length(vector<int> aa, vector<int> bb) {
	int p = (int) aa.size(), q = (int) bb.size();
	
	for (int i = 1; i <= p; i++) {
		a[i].first = aa[i - 1];
		sa.insert(aa[i - 1]);
		a[i].second = -1;
	}
	for (int i = 1; i <= q; i++) {
		a[i + p].first = bb[i - 1];
		sb.insert(bb[i - 1]);
		a[i + p].second = 1;
	}
	
	n = p + q;
	sort(a + 1, a + 1 + n);
	memset(mat, 255, sizeof(mat));
	memset(prv, 255, sizeof(prv));
	
	prv[n] = 0;
	int cur = n;
	for (int i = 1; i <= n; i++) {
		suma[i] = suma[i - 1]; sumb[i] = sumb[i - 1];
		if (a[i].second == -1) {
			suma[i] += a[i].first;
			cur++;
		}
		else {
			sumb[i] += a[i].first;
			cur--;
		}
		if (prv[cur] >= 0) {
			mat[i] = prv[cur];
		}
		prv[cur] = i;
	}
	
	for (int i = 1; i <= n; i++) {
		dp[i] = dp[i - 1] + getnear(i);
		if (~mat[i]) {
			dp[i] = min(dp[i], dp[mat[i]] + abs(suma[i] - suma[mat[i]] - sumb[i] + sumb[mat[i]]));
		}
	}
	
	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...