#include "swap.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
vector<array<int, 3> > edges(MAXN * 2);
int DP[20][MAXN * 3];
struct ufds {
bool isLine;
pair<int, int> endpoints;
int parent, value, depth;
ufds(int x) {
isLine = true;
endpoints = {x, x};
parent = x;
value = 1e9;
depth = 0;
}
} *Node[MAXN * 3];
int Find(int x) {
if(Node[x]->parent == x) {
return x;
}
return Node[x]->parent = Find(Node[x]->parent);
}
void Unite(int a, int b, int new_idx, int cur_val) {
int original_a = a, original_b = b;
a = Find(a);
b = Find(b);
Node[a]->parent = new_idx;
Node[b]->parent = new_idx;
Node[new_idx]->value = cur_val;
DP[0][a] = new_idx;
DP[0][b] = new_idx;
if(a == b || !Node[a]->isLine || !Node[b]->isLine) {
Node[new_idx]->isLine = false;
Node[new_idx]->endpoints = {-1, -1};
}
else {
//cout << "a = " << a << ", b = " << b << "\n";
//cout << "A Line = " << Node[a]->endpoints.first << ", " << Node[a]->endpoints.second << "\n";
//cout << "B Line = " << Node[b]->endpoints.first << ", " << Node[b]->endpoints.second << "\n";
if(Node[a]->endpoints.first != original_a) {
swap(Node[a]->endpoints.first, Node[a]->endpoints.second);
}
if(Node[b]->endpoints.first != original_b) {
swap(Node[b]->endpoints.first, Node[b]->endpoints.second);
}
if(original_a == Node[a]->endpoints.first && original_b == Node[b]->endpoints.first) {
Node[new_idx]->isLine = true;
Node[new_idx]->endpoints = {Node[a]->endpoints.second, Node[b]->endpoints.second};
}
else {
Node[new_idx]->isLine = false;
Node[new_idx]->endpoints = {-1, -1};
}
}
}
bool cmp(array<int, 3> a, array<int, 3> b) {
return a[2] < b[2];
}
void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) {
auto begin = std::chrono::high_resolution_clock::now();
for(int i = 0; i < 20; i++) {
for(int j = 0; j < MAXN * 3; j++) {
DP[i][j] = -1;
}
}
for(int i = 0; i < M; i++) {
edges[i] = {U[i], V[i], W[i]};
}
sort(edges.begin(), edges.begin() + M, cmp);
int cur_new = N;
for(int i = 0; i < MAXN * 3; i++) {
Node[i] = new ufds(i);
}
for(int i = 0; i < M; i++) {
//cout << Find(edges[i][0]) << " " << Find(edges[i][1]) << "\n";
int x = Find(edges[i][0]), y = Find(edges[i][1]);
//cout << "x = " << x << ", Node[x] is a line? " << Node[x]->isLine << "\n";
if(x != y || Node[x]->isLine == true) {
//cout << "Uniting edge: (" << edges[i][0] << ", " << edges[i][1] << ", " << edges[i][2] << ")\n";
Unite(edges[i][0], edges[i][1], cur_new++, edges[i][2]);
}
}
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
if(elapsed.count() * 1e-9 > 2.0) {
assert(false);
}
assert(cur_new <= MAXN * 3);
for(int i = 1; i < 20; i++) {
for(int j = 0; j < cur_new; j++) {
if(DP[i - 1][j] != -1) {
DP[i][j] = DP[i - 1][DP[i - 1][j]];
}
else {
DP[i][j] = -1;
}
}
}
}
bool Check(int val, int X, int Y) {
for(int i = 19; i >= 0; i--) {
if(DP[i][X] != -1 && Node[DP[i][X]]->value <= val) {
X = DP[i][X];
}
if(DP[i][Y] != -1 && Node[DP[i][Y]]->value <= val) {
Y = DP[i][Y];
}
}
return (X == Y && Node[X]->isLine == false);
}
int getMinimumFuelCapacity(int X, int Y) {
int ans = 1e9 + 2;
int l = 0, r = 1e9;
while(l <= r) {
int mid = (l + r) / 2;
if(Check(mid, X, Y)) {
r = mid - 1;
ans = mid;
}
else {
l = mid + 1;
}
}
if(ans == 1e9 + 2) {
ans = -1;
}
return ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
20 ms |
37836 KB |
Output is correct |
2 |
Correct |
21 ms |
37820 KB |
Output is correct |
3 |
Correct |
20 ms |
37860 KB |
Output is correct |
4 |
Correct |
22 ms |
37836 KB |
Output is correct |
5 |
Correct |
21 ms |
37908 KB |
Output is correct |
6 |
Correct |
22 ms |
37836 KB |
Output is correct |
7 |
Correct |
21 ms |
37836 KB |
Output is correct |
8 |
Correct |
21 ms |
37840 KB |
Output is correct |
9 |
Correct |
64 ms |
41324 KB |
Output is correct |
10 |
Correct |
87 ms |
42028 KB |
Output is correct |
11 |
Correct |
75 ms |
42180 KB |
Output is correct |
12 |
Correct |
81 ms |
42396 KB |
Output is correct |
13 |
Correct |
70 ms |
42812 KB |
Output is correct |
14 |
Correct |
118 ms |
41704 KB |
Output is correct |
15 |
Correct |
689 ms |
46188 KB |
Output is correct |
16 |
Correct |
691 ms |
46092 KB |
Output is correct |
17 |
Correct |
676 ms |
46344 KB |
Output is correct |
18 |
Correct |
1218 ms |
46824 KB |
Output is correct |
19 |
Correct |
387 ms |
43632 KB |
Output is correct |
20 |
Correct |
659 ms |
47148 KB |
Output is correct |
21 |
Correct |
693 ms |
47564 KB |
Output is correct |
22 |
Correct |
711 ms |
47732 KB |
Output is correct |
23 |
Correct |
1220 ms |
48248 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
20 ms |
37836 KB |
Output is correct |
2 |
Correct |
21 ms |
37820 KB |
Output is correct |
3 |
Execution timed out |
2081 ms |
45488 KB |
Time limit exceeded |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
20 ms |
37836 KB |
Output is correct |
2 |
Correct |
21 ms |
37820 KB |
Output is correct |
3 |
Correct |
20 ms |
37860 KB |
Output is correct |
4 |
Correct |
22 ms |
37836 KB |
Output is correct |
5 |
Correct |
21 ms |
37908 KB |
Output is correct |
6 |
Correct |
22 ms |
37836 KB |
Output is correct |
7 |
Correct |
21 ms |
37836 KB |
Output is correct |
8 |
Correct |
21 ms |
37840 KB |
Output is correct |
9 |
Correct |
19 ms |
37800 KB |
Output is correct |
10 |
Correct |
20 ms |
37872 KB |
Output is correct |
11 |
Correct |
20 ms |
37864 KB |
Output is correct |
12 |
Correct |
19 ms |
37828 KB |
Output is correct |
13 |
Correct |
21 ms |
37880 KB |
Output is correct |
14 |
Correct |
20 ms |
37796 KB |
Output is correct |
15 |
Correct |
19 ms |
37836 KB |
Output is correct |
16 |
Correct |
19 ms |
37892 KB |
Output is correct |
17 |
Correct |
19 ms |
37792 KB |
Output is correct |
18 |
Correct |
20 ms |
37888 KB |
Output is correct |
19 |
Correct |
20 ms |
37928 KB |
Output is correct |
20 |
Correct |
18 ms |
37816 KB |
Output is correct |
21 |
Correct |
21 ms |
37804 KB |
Output is correct |
22 |
Correct |
20 ms |
37836 KB |
Output is correct |
23 |
Correct |
19 ms |
37836 KB |
Output is correct |
24 |
Correct |
20 ms |
37868 KB |
Output is correct |
25 |
Correct |
20 ms |
37824 KB |
Output is correct |
26 |
Correct |
20 ms |
37812 KB |
Output is correct |
27 |
Correct |
20 ms |
37872 KB |
Output is correct |
28 |
Correct |
20 ms |
37844 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
37800 KB |
Output is correct |
2 |
Correct |
20 ms |
37836 KB |
Output is correct |
3 |
Correct |
21 ms |
37820 KB |
Output is correct |
4 |
Correct |
20 ms |
37860 KB |
Output is correct |
5 |
Correct |
22 ms |
37836 KB |
Output is correct |
6 |
Correct |
21 ms |
37908 KB |
Output is correct |
7 |
Correct |
22 ms |
37836 KB |
Output is correct |
8 |
Correct |
21 ms |
37836 KB |
Output is correct |
9 |
Correct |
21 ms |
37840 KB |
Output is correct |
10 |
Correct |
64 ms |
41324 KB |
Output is correct |
11 |
Correct |
87 ms |
42028 KB |
Output is correct |
12 |
Correct |
75 ms |
42180 KB |
Output is correct |
13 |
Correct |
81 ms |
42396 KB |
Output is correct |
14 |
Correct |
70 ms |
42812 KB |
Output is correct |
15 |
Correct |
20 ms |
37872 KB |
Output is correct |
16 |
Correct |
20 ms |
37864 KB |
Output is correct |
17 |
Correct |
19 ms |
37828 KB |
Output is correct |
18 |
Correct |
21 ms |
37880 KB |
Output is correct |
19 |
Correct |
20 ms |
37796 KB |
Output is correct |
20 |
Correct |
19 ms |
37836 KB |
Output is correct |
21 |
Correct |
19 ms |
37892 KB |
Output is correct |
22 |
Correct |
19 ms |
37792 KB |
Output is correct |
23 |
Correct |
20 ms |
37888 KB |
Output is correct |
24 |
Correct |
20 ms |
37928 KB |
Output is correct |
25 |
Correct |
18 ms |
37816 KB |
Output is correct |
26 |
Correct |
21 ms |
37804 KB |
Output is correct |
27 |
Correct |
20 ms |
37836 KB |
Output is correct |
28 |
Correct |
19 ms |
37836 KB |
Output is correct |
29 |
Correct |
20 ms |
37868 KB |
Output is correct |
30 |
Correct |
20 ms |
37824 KB |
Output is correct |
31 |
Correct |
20 ms |
37812 KB |
Output is correct |
32 |
Correct |
20 ms |
37872 KB |
Output is correct |
33 |
Correct |
20 ms |
37844 KB |
Output is correct |
34 |
Correct |
25 ms |
38348 KB |
Output is correct |
35 |
Correct |
76 ms |
41952 KB |
Output is correct |
36 |
Correct |
75 ms |
41952 KB |
Output is correct |
37 |
Correct |
76 ms |
41956 KB |
Output is correct |
38 |
Correct |
74 ms |
41924 KB |
Output is correct |
39 |
Correct |
73 ms |
41932 KB |
Output is correct |
40 |
Correct |
69 ms |
41584 KB |
Output is correct |
41 |
Correct |
80 ms |
42216 KB |
Output is correct |
42 |
Correct |
74 ms |
41924 KB |
Output is correct |
43 |
Correct |
72 ms |
41952 KB |
Output is correct |
44 |
Correct |
82 ms |
42212 KB |
Output is correct |
45 |
Correct |
104 ms |
44368 KB |
Output is correct |
46 |
Correct |
71 ms |
41964 KB |
Output is correct |
47 |
Correct |
75 ms |
41924 KB |
Output is correct |
48 |
Correct |
84 ms |
42476 KB |
Output is correct |
49 |
Correct |
78 ms |
44308 KB |
Output is correct |
50 |
Correct |
65 ms |
42984 KB |
Output is correct |
51 |
Correct |
92 ms |
43492 KB |
Output is correct |
52 |
Correct |
113 ms |
44972 KB |
Output is correct |
53 |
Correct |
137 ms |
45816 KB |
Output is correct |
54 |
Correct |
129 ms |
46464 KB |
Output is correct |
55 |
Correct |
66 ms |
41964 KB |
Output is correct |
56 |
Correct |
129 ms |
45492 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
20 ms |
37836 KB |
Output is correct |
2 |
Correct |
21 ms |
37820 KB |
Output is correct |
3 |
Correct |
20 ms |
37860 KB |
Output is correct |
4 |
Correct |
22 ms |
37836 KB |
Output is correct |
5 |
Correct |
21 ms |
37908 KB |
Output is correct |
6 |
Correct |
22 ms |
37836 KB |
Output is correct |
7 |
Correct |
21 ms |
37836 KB |
Output is correct |
8 |
Correct |
21 ms |
37840 KB |
Output is correct |
9 |
Correct |
64 ms |
41324 KB |
Output is correct |
10 |
Correct |
87 ms |
42028 KB |
Output is correct |
11 |
Correct |
75 ms |
42180 KB |
Output is correct |
12 |
Correct |
81 ms |
42396 KB |
Output is correct |
13 |
Correct |
70 ms |
42812 KB |
Output is correct |
14 |
Correct |
118 ms |
41704 KB |
Output is correct |
15 |
Correct |
689 ms |
46188 KB |
Output is correct |
16 |
Correct |
691 ms |
46092 KB |
Output is correct |
17 |
Correct |
676 ms |
46344 KB |
Output is correct |
18 |
Correct |
1218 ms |
46824 KB |
Output is correct |
19 |
Execution timed out |
2081 ms |
45488 KB |
Time limit exceeded |
20 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
37800 KB |
Output is correct |
2 |
Correct |
20 ms |
37836 KB |
Output is correct |
3 |
Correct |
21 ms |
37820 KB |
Output is correct |
4 |
Correct |
20 ms |
37860 KB |
Output is correct |
5 |
Correct |
22 ms |
37836 KB |
Output is correct |
6 |
Correct |
21 ms |
37908 KB |
Output is correct |
7 |
Correct |
22 ms |
37836 KB |
Output is correct |
8 |
Correct |
21 ms |
37836 KB |
Output is correct |
9 |
Correct |
21 ms |
37840 KB |
Output is correct |
10 |
Correct |
64 ms |
41324 KB |
Output is correct |
11 |
Correct |
87 ms |
42028 KB |
Output is correct |
12 |
Correct |
75 ms |
42180 KB |
Output is correct |
13 |
Correct |
81 ms |
42396 KB |
Output is correct |
14 |
Correct |
70 ms |
42812 KB |
Output is correct |
15 |
Correct |
118 ms |
41704 KB |
Output is correct |
16 |
Correct |
689 ms |
46188 KB |
Output is correct |
17 |
Correct |
691 ms |
46092 KB |
Output is correct |
18 |
Correct |
676 ms |
46344 KB |
Output is correct |
19 |
Correct |
1218 ms |
46824 KB |
Output is correct |
20 |
Execution timed out |
2081 ms |
45488 KB |
Time limit exceeded |
21 |
Halted |
0 ms |
0 KB |
- |