제출 #69760

#제출 시각아이디문제언어결과실행 시간메모리
69760Noam527전선 연결 (IOI17_wiring)C++17
100 / 100
67 ms69816 KiB
#include "wiring.h"
#include <bits/stdc++.h>
#define endl '\n'
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define debug cout << "ok" << endl
#define finish(x) return cout << x << endl, 0
typedef long long ll;
typedef long double ldb;
const int md = 1e9 + 7;
const ll hs = 199, inf = 1e16;
const ldb eps = 1e-9, pi = acos(-1);
using namespace std;

ll min_total_length(vector<int> r, vector<int> b) {
	int n = r.size() + b.size();
	vector<int> a(n), col(n);
	vector<ll> dp(n);
	int p1 = 0, p2 = 0;
	while (p1 < r.size() && p2 < b.size()) {
		if (r[p1] < b[p2])
			a[p1 + p2] = r[p1], col[p1 + p2] = 0, p1++;
		else
			a[p1 + p2] = b[p2], col[p1 + p2] = 1, p2++;
	}
	while (p1 < r.size())
		a[p1 + p2] = r[p1], col[p1 + p2] = 0, p1++;
	while (p2 < b.size())
		a[p1 + p2] = b[p2], col[p1 + p2] = 1, p2++;

	vector<int> pos;
	pos.push_back(0);
	for (int i = 1; i < n; i++)
		if (col[i] != col[i - 1]) pos.push_back(i);
	for (int i = pos[0]; i < pos[1]; i++) dp[i] = inf;

	vector<ll> mn(n);
	ll curval;
	for (int ind = 1, S, T, nxt; ind < pos.size(); ind++) {
		S = pos[ind - 1];
		T = pos[ind];
		nxt = (ind + 1 < pos.size() ? pos[ind + 1] : n);
		// part 1
		curval = 0;
		for (int j = T - 1; j >= S; j--) {
			curval += a[T - 1] - a[j];
			if (j > 0)
				mn[j] = min(dp[j - 1], dp[j]) + curval;
			else
				mn[j] = curval;
			if (j + 1 < T) mn[j] = min(mn[j], mn[j + 1]);
		}
		curval = 0;
		for (int j = T; j < nxt; j++) {
			curval += a[j] - a[T - 1];
			dp[j] = curval + mn[max(S, 2 * T - j - 1)];
		}
		// part 2
		curval = 0;
		for (int j = S; j < T; j++)
			curval += a[T] - a[j];
		for (int j = S; j < T; j++) {
			if (j > 0)
				mn[j] = min(dp[j - 1], dp[j]) + curval;
			else
				mn[j] = curval;
			if (S < j) mn[j] = min(mn[j], mn[j - 1]);
			curval -= (a[T] - a[j]);
		}
		curval = 0;
		for (int j = T; j < nxt; j++) {
			curval += (a[j] - a[T]);
			if (S <= 2 * T - j - 1)
				dp[j] = min(dp[j], curval + mn[2 * T - j - 1]);
		}
	}
	return dp.back();
}
/*
int main() {
	int n, m;
	cin >> n >> m;
	vector<int> a(n), b(m);
	for (auto &i : a) cin >> i;
	for (auto &i : b) cin >> i;
	cout << min_total_length(a, b) << endl;
}
*/

컴파일 시 표준 에러 (stderr) 메시지

wiring.cpp: In function 'll min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:19:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (p1 < r.size() && p2 < b.size()) {
         ~~~^~~~~~~~~~
wiring.cpp:19:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (p1 < r.size() && p2 < b.size()) {
                          ~~~^~~~~~~~~~
wiring.cpp:25:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (p1 < r.size())
         ~~~^~~~~~~~~~
wiring.cpp:27:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (p2 < b.size())
         ~~~^~~~~~~~~~
wiring.cpp:38:35: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int ind = 1, S, T, nxt; ind < pos.size(); ind++) {
                               ~~~~^~~~~~~~~~~~
wiring.cpp:41:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   nxt = (ind + 1 < pos.size() ? pos[ind + 1] : 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...