답안 #913882

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
913882 2024-01-20T11:33:26 Z Asymmetry Roller Coaster Railroad (IOI16_railroad) C++17
100 / 100
1934 ms 126384 KB
#include<bits/stdc++.h>
using namespace std;
using LL=long long;
#define FOR(i,l,r)for(int i=(l);i<=(r);++i)
#define REP(i,n)FOR(i,0,(n)-1)
#define ssize(x)int(x.size())
#ifdef DEBUG
auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";}
#define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif

LL plan_roller_coaster(vector<int> s, vector<int> t) {
	int n = ssize(s);
	map<int, int> imp;
	vector<pair<int, int>> edges;
	REP (i, n) {
		++imp[s[i]];
		--imp[t[i]];
		edges.emplace_back(s[i], t[i]);
		debug(s[i], t[i]);
	}
	const int INF = 1e9;
	--imp[1];
	++imp[INF];
	edges.emplace_back(INF, 1);
	debug(imp);
	vector<pair<int, int>> stc;
	int sum = 0;
	LL answer = 0;
	for (auto [speed, delta] : imp) {
		debug(speed, delta, sum, stc);
		if (sum > 0 && delta < 0) {
			while (ssize(stc) && delta) {
				auto [beg, cnt] = stc.back();
				stc.pop_back();
				edges.emplace_back(speed, beg);
				answer += speed - beg;
				--cnt;
				++delta;
				--sum;
				if (cnt)
					stc.emplace_back(beg, cnt);
			}
		}
		else if (sum < 0 && delta > 0) {
			while (ssize(stc) && delta) {
				auto [beg, cnt] = stc.back();
				stc.pop_back();
				edges.emplace_back(beg, speed);
				--cnt;
				--delta;
				++sum;
				if (cnt)
					stc.emplace_back(beg, cnt);
			}
		}
		debug("again", speed, delta, sum, stc);
		if (delta) {
			stc.emplace_back(speed, abs(delta));
			sum += delta;
		}
		else if (ssize(stc) && stc.back().first != speed) {
			debug("special");
			auto [beg, cnt] = stc.back();
			stc.pop_back();
			if (sum > 0) {
				edges.emplace_back(speed, beg);
				answer += speed - beg;
			}
			else {
				edges.emplace_back(beg, speed);
			}
			--cnt;
			if (cnt)
				stc.emplace_back(beg, cnt);
			stc.emplace_back(speed, 1);
		}
	}
	assert(sum == 0);
	debug(edges);
	debug(answer);
	map<int, int> color;
	map<int, vector<int>> graph;
	for (auto [u, v] : edges)
		graph[u].emplace_back(v);
	int m = 0;
	for (const auto &[i, adj] : graph) {
		if (!color.count(i)) {
			function<void(int)> dfs = [&](int v) {
				color[v] = m;
				for (int u : graph[v])
					if (!color.count(u))
						dfs(u);
			};
			dfs(i);
			++m;
		}
	}
	debug(color);
	vector<int> rep(m);
	iota(rep.begin(), rep.end(), 0);
	function<int(int)> fin = [&](int v) {
		if (v != rep[v])
			rep[v] = fin(rep[v]);
		return rep[v];
	};
	auto uni = [&](int a, int b) {
		a = fin(a);
		b = fin(b);
		if (a == b)
			return false;
		rep[b] = a;
		return true;
	};
	int last = 1;
	vector<tuple<int, int, int>> sr;
	for (auto [pos, type] : color) {
		if (color[last] != type) {
			sr.emplace_back(pos - last, color[last], type);
		}
		last = pos;
	}
	sort(sr.begin(), sr.end());
	for (auto [cost, a, b] : sr) {
		debug(cost, a, b);
		if (uni(a, b))
			answer += cost;
	}
	return answer;
}

#ifdef LOCAL
int main() {
	cin.tie(0)->sync_with_stdio(0);
	int n;
	cin >> n;
	vector<int> s(n), t(n);
	REP (i, n)
		cin >> s[i] >> t[i];
	cout << plan_roller_coaster(s, t) << endl;
}
#endif
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 2
2 Correct 1 ms 348 KB n = 2
3 Correct 1 ms 348 KB n = 2
4 Correct 1 ms 344 KB n = 2
5 Correct 1 ms 348 KB n = 2
6 Correct 0 ms 432 KB n = 2
7 Correct 1 ms 348 KB n = 3
8 Correct 0 ms 360 KB n = 3
9 Correct 1 ms 344 KB n = 3
10 Correct 1 ms 344 KB n = 8
11 Correct 0 ms 348 KB n = 8
12 Correct 1 ms 348 KB n = 8
13 Correct 1 ms 348 KB n = 8
14 Correct 0 ms 348 KB n = 8
15 Correct 1 ms 344 KB n = 8
16 Correct 1 ms 348 KB n = 8
17 Correct 1 ms 348 KB n = 8
18 Correct 1 ms 348 KB n = 8
19 Correct 1 ms 500 KB n = 3
20 Correct 1 ms 348 KB n = 7
21 Correct 1 ms 348 KB n = 8
22 Correct 1 ms 592 KB n = 8
23 Correct 1 ms 344 KB n = 8
24 Correct 0 ms 348 KB n = 8
25 Correct 1 ms 344 KB n = 8
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 2
2 Correct 1 ms 348 KB n = 2
3 Correct 1 ms 348 KB n = 2
4 Correct 1 ms 344 KB n = 2
5 Correct 1 ms 348 KB n = 2
6 Correct 0 ms 432 KB n = 2
7 Correct 1 ms 348 KB n = 3
8 Correct 0 ms 360 KB n = 3
9 Correct 1 ms 344 KB n = 3
10 Correct 1 ms 344 KB n = 8
11 Correct 0 ms 348 KB n = 8
12 Correct 1 ms 348 KB n = 8
13 Correct 1 ms 348 KB n = 8
14 Correct 0 ms 348 KB n = 8
15 Correct 1 ms 344 KB n = 8
16 Correct 1 ms 348 KB n = 8
17 Correct 1 ms 348 KB n = 8
18 Correct 1 ms 348 KB n = 8
19 Correct 1 ms 500 KB n = 3
20 Correct 1 ms 348 KB n = 7
21 Correct 1 ms 348 KB n = 8
22 Correct 1 ms 592 KB n = 8
23 Correct 1 ms 344 KB n = 8
24 Correct 0 ms 348 KB n = 8
25 Correct 1 ms 344 KB n = 8
26 Correct 1 ms 348 KB n = 8
27 Correct 1 ms 348 KB n = 8
28 Correct 1 ms 348 KB n = 8
29 Correct 1 ms 348 KB n = 16
30 Correct 1 ms 348 KB n = 16
31 Correct 1 ms 348 KB n = 16
32 Correct 1 ms 344 KB n = 16
33 Correct 1 ms 344 KB n = 16
34 Correct 0 ms 348 KB n = 16
35 Correct 0 ms 348 KB n = 16
36 Correct 1 ms 348 KB n = 15
37 Correct 1 ms 348 KB n = 8
38 Correct 1 ms 344 KB n = 16
39 Correct 0 ms 348 KB n = 16
40 Correct 1 ms 348 KB n = 9
41 Correct 1 ms 348 KB n = 16
42 Correct 1 ms 344 KB n = 16
43 Correct 1 ms 348 KB n = 16
44 Correct 0 ms 348 KB n = 9
45 Correct 1 ms 600 KB n = 15
46 Correct 1 ms 348 KB n = 16
47 Correct 0 ms 348 KB n = 16
48 Correct 1 ms 348 KB n = 16
# 결과 실행 시간 메모리 Grader output
1 Correct 1822 ms 110304 KB n = 199999
2 Correct 1564 ms 108280 KB n = 199991
3 Correct 1338 ms 107068 KB n = 199993
4 Correct 1317 ms 84968 KB n = 152076
5 Correct 537 ms 53336 KB n = 93249
6 Correct 792 ms 82128 KB n = 199910
7 Correct 927 ms 100420 KB n = 199999
8 Correct 718 ms 85996 KB n = 199997
9 Correct 1146 ms 87752 KB n = 171294
10 Correct 1071 ms 79188 KB n = 140872
11 Correct 798 ms 84672 KB n = 199886
12 Correct 936 ms 104256 KB n = 199996
13 Correct 841 ms 93084 KB n = 200000
14 Correct 871 ms 110240 KB n = 199998
15 Correct 791 ms 104844 KB n = 200000
16 Correct 803 ms 107352 KB n = 199998
17 Correct 1055 ms 111140 KB n = 200000
18 Correct 940 ms 89756 KB n = 190000
19 Correct 969 ms 92308 KB n = 177777
20 Correct 465 ms 54672 KB n = 100000
21 Correct 1231 ms 108392 KB n = 200000
22 Correct 1032 ms 97908 KB n = 200000
23 Correct 1506 ms 123420 KB n = 200000
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 2
2 Correct 1 ms 348 KB n = 2
3 Correct 1 ms 348 KB n = 2
4 Correct 1 ms 344 KB n = 2
5 Correct 1 ms 348 KB n = 2
6 Correct 0 ms 432 KB n = 2
7 Correct 1 ms 348 KB n = 3
8 Correct 0 ms 360 KB n = 3
9 Correct 1 ms 344 KB n = 3
10 Correct 1 ms 344 KB n = 8
11 Correct 0 ms 348 KB n = 8
12 Correct 1 ms 348 KB n = 8
13 Correct 1 ms 348 KB n = 8
14 Correct 0 ms 348 KB n = 8
15 Correct 1 ms 344 KB n = 8
16 Correct 1 ms 348 KB n = 8
17 Correct 1 ms 348 KB n = 8
18 Correct 1 ms 348 KB n = 8
19 Correct 1 ms 500 KB n = 3
20 Correct 1 ms 348 KB n = 7
21 Correct 1 ms 348 KB n = 8
22 Correct 1 ms 592 KB n = 8
23 Correct 1 ms 344 KB n = 8
24 Correct 0 ms 348 KB n = 8
25 Correct 1 ms 344 KB n = 8
26 Correct 1 ms 348 KB n = 8
27 Correct 1 ms 348 KB n = 8
28 Correct 1 ms 348 KB n = 8
29 Correct 1 ms 348 KB n = 16
30 Correct 1 ms 348 KB n = 16
31 Correct 1 ms 348 KB n = 16
32 Correct 1 ms 344 KB n = 16
33 Correct 1 ms 344 KB n = 16
34 Correct 0 ms 348 KB n = 16
35 Correct 0 ms 348 KB n = 16
36 Correct 1 ms 348 KB n = 15
37 Correct 1 ms 348 KB n = 8
38 Correct 1 ms 344 KB n = 16
39 Correct 0 ms 348 KB n = 16
40 Correct 1 ms 348 KB n = 9
41 Correct 1 ms 348 KB n = 16
42 Correct 1 ms 344 KB n = 16
43 Correct 1 ms 348 KB n = 16
44 Correct 0 ms 348 KB n = 9
45 Correct 1 ms 600 KB n = 15
46 Correct 1 ms 348 KB n = 16
47 Correct 0 ms 348 KB n = 16
48 Correct 1 ms 348 KB n = 16
49 Correct 1822 ms 110304 KB n = 199999
50 Correct 1564 ms 108280 KB n = 199991
51 Correct 1338 ms 107068 KB n = 199993
52 Correct 1317 ms 84968 KB n = 152076
53 Correct 537 ms 53336 KB n = 93249
54 Correct 792 ms 82128 KB n = 199910
55 Correct 927 ms 100420 KB n = 199999
56 Correct 718 ms 85996 KB n = 199997
57 Correct 1146 ms 87752 KB n = 171294
58 Correct 1071 ms 79188 KB n = 140872
59 Correct 798 ms 84672 KB n = 199886
60 Correct 936 ms 104256 KB n = 199996
61 Correct 841 ms 93084 KB n = 200000
62 Correct 871 ms 110240 KB n = 199998
63 Correct 791 ms 104844 KB n = 200000
64 Correct 803 ms 107352 KB n = 199998
65 Correct 1055 ms 111140 KB n = 200000
66 Correct 940 ms 89756 KB n = 190000
67 Correct 969 ms 92308 KB n = 177777
68 Correct 465 ms 54672 KB n = 100000
69 Correct 1231 ms 108392 KB n = 200000
70 Correct 1032 ms 97908 KB n = 200000
71 Correct 1506 ms 123420 KB n = 200000
72 Correct 1934 ms 114180 KB n = 200000
73 Correct 1786 ms 110240 KB n = 200000
74 Correct 1406 ms 105468 KB n = 200000
75 Correct 1126 ms 112516 KB n = 200000
76 Correct 1125 ms 126384 KB n = 200000
77 Correct 724 ms 67000 KB n = 200000
78 Correct 578 ms 56152 KB n = 200000
79 Correct 1286 ms 94952 KB n = 184307
80 Correct 412 ms 42436 KB n = 76040
81 Correct 972 ms 84396 KB n = 199981
82 Correct 854 ms 104912 KB n = 199994
83 Correct 848 ms 92184 KB n = 199996
84 Correct 854 ms 109712 KB n = 199998
85 Correct 855 ms 104940 KB n = 200000
86 Correct 894 ms 107340 KB n = 199998
87 Correct 1111 ms 111536 KB n = 200000
88 Correct 1049 ms 97008 KB n = 200000
89 Correct 1199 ms 102836 KB n = 200000
90 Correct 1368 ms 106728 KB n = 200000
91 Correct 1101 ms 97900 KB n = 200000
92 Correct 1477 ms 123584 KB n = 200000