제출 #1333508

#제출 시각아이디문제언어결과실행 시간메모리
1333508blackscreen1전선 연결 (IOI17_wiring)C++20
100 / 100
56 ms9272 KiB
#include "wiring.h"
#include <bits//stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<long long, null_type, less<long long>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_multiset;
#define ll long long
#define iloop(m, h) for (auto i = m; i != h; i += (m < h ? 1 : -1))
#define jloop(m, h) for (auto j = m; j != h; j += (m < h ? 1 : -1))
#define kloop(m, h) for (auto k = m; k != h; k += (m < h ? 1 : -1))
#define lloop(m, h) for (auto l = m; l != h; l += (m < h ? 1 : -1))
#define pll pair<ll, ll>
#define INF 1000000000000000
#define MOD1 1000000007
#define MOD2 998244353
#define MOD3 1000000009
ll n, cr, cb, cr2, cb2, dp[200005];
ll ext, prv;
vector<pll> v;
vector<ll> vr, vb;
long long min_total_length(vector<int> r, vector<int> b) {
	for (auto it : r) v.push_back({it, 0}), vr.push_back(it);
	for (auto it : b) v.push_back({it, 1}), vb.push_back(it);
	vr.push_back(-INF), vr.push_back(INF);
	vb.push_back(-INF), vb.push_back(INF);
	sort(v.begin(), v.end());
	n = v.size();
	sort(vr.begin(), vr.end());
	sort(vb.begin(), vb.end());
	cr = cr2 = cb = cb2 = 0;
	dp[0] = 0;
	ext = prv = 0;
	iloop(1, n+1) {
		if (v[i-1].second == 0) {
			while (vb[cb] < v[i-1].first) cb++;
			while (vb[cb2 + 1] < v[i-1].first) cb2++;
			dp[i] = dp[i-1] + min(vb[cb] - v[i-1].first, v[i-1].first - vb[cb2]);
		}
		else {
			while (vr[cr] < v[i-1].first) cr++;
			while (vr[cr2 + 1] < v[i-1].first) cr2++;
			dp[i] = dp[i-1] + min(vr[cr] - v[i-1].first, v[i-1].first - vr[cr2]);
		}
		//cout << dp[i] << ",";
		if (i-1 && v[i-1].second != v[i-2].second) {
			prv = i-1, ext = v[i-1].first - v[i-2].first; // pair last 2
			dp[i] = min(dp[i], dp[i-2] + ext);
		}
		else if (prv-1 > 0 && v[prv-1].second == v[prv-1].second) {
			prv--, ext += v[i-1].first - v[prv-1].first; // pair last 2k
			dp[i] = min(dp[i], dp[prv-1] + ext);
		}
		else prv = 0;
		//cout << dp[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...