#include "simurgh.h"
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define sc second
using namespace std;
typedef long long int ll;
typedef string str;
struct dsu{
int n;
vector<int> sz, p;
dsu(int _n): n(_n){
sz.resize(n, 1);
p.resize(n);
for(int i = 0; i < n; i++) p[i] = i;
}
int get(int x){
if(p[x] != x) p[x] = get(p[x]);
return p[x];
}
bool unite(int a, int b){
a = get(a), b = get(b);
if(a == b) return 0;
if(sz[b] > sz[a]) swap(a, b);
sz[a]+=sz[b];
sz[b] = 0;
p[b] = a;
return 1;
}
};
int n, m;
vector<int> U, V;
vector<int> royal;
vector<vector<pair<int, int>>> graph;
int count_common_roads(const basic_string<int>& E){
vector<int> EE;
for(int x: E) EE.pb(x);
return count_common_roads(EE);
}
basic_string<int> generate_tree(const basic_string<int>& E){
dsu ds(n);
basic_string<int> T;
for(int i: E){
if(ds.unite(U[i], V[i])) T.pb(i);
else return {};
}
for(int i = 0; i < m; i++) if(ds.unite(U[i], V[i])) T.pb(i);
return T;
}
pair<basic_string<int>,basic_string<int>> forcefully_generate_tree(const basic_string<int>& E){
dsu ds(n);
basic_string<int> T, I;
for(int i: E){
if(ds.unite(U[i], V[i])) T.pb(i);
else I.pb(i);
}
for(int i = 0; i < m; i++) if(ds.unite(U[i], V[i])) T.pb(i);
return {T, I};
}
int replacement_edge(const basic_string<int>& E, int i){
dsu ds(n);
for(int j: E) if(j != i) ds.unite(U[j], V[j]);
for(int j = 0; j < m; j++) if(j != i && ds.unite(U[j], V[j])) return j;
return -1;
}
int count_extra_royal(const basic_string<int>& T, basic_string<int> C){
dsu ds(n);
int c = 0;
vector<int> q;
for(int i: C) ds.unite(U[i], V[i]), q.pb(i);
for(int i: T) if(ds.unite(U[i], V[i])) c+=max(royal[i], 0), q.pb(i);
return count_common_roads(q)-c;
}
vector<int> find_roads(int _n, vector<int> _U, vector<int> _V){
swap(n, _n), swap(U, _U), swap(V, _V);
m = U.size();
royal.assign(m, -1);
graph.resize(n);
for(int i = 0; i < m; i++){
graph[U[i]].pb({V[i], i});
graph[V[i]].pb({U[i], i});
}
basic_string<int> A, B = {0};
while(1){
int x, y, z;
int ei = int(A.size()+B.size())-1, e = B.back();
if(A.size()+B.size() == n-1){
int cnt = 0;
for(int i: A) if(royal[i] == 1) cnt++;
int x = count_common_roads(A+B);
A+=B;
for(int i: B) royal[i] = (x > cnt);
break;
}
auto T = generate_tree(A+B);
int i = replacement_edge(T, e);
if(i == -1){
for(int j: B) royal[j] = 1;
goto finalize;
}
x = count_common_roads(T);
T[ei] = i;
y = count_common_roads(T);
T[ei] = e;
if(x > y){
for(int j: B) royal[j] = 1;
royal[i] = 0;
goto finalize;
}
else if(x < y){
for(int j: B) royal[j] = 0;
royal[i] = 1;
goto finalize;
}
else{
if(royal[i] != -1){
for(int j: B) royal[j] = royal[i];
goto finalize;
}
if(generate_tree(A+B+i).empty()){
if(generate_tree(B+i).empty()){
for(int j: B) royal[j] = 0;
royal[i] = 0;
goto finalize;
}
auto [T2, I] = forcefully_generate_tree(B+i+A);
z = count_common_roads(T2);
if(z > x){
for(int j: B) royal[j] = 1;
}
else if(z < x){
for(int j: B) royal[j] = 0;
}
else{
for(int j: B) royal[j] = royal[I[0]];
}
goto finalize;
}
else{
B.pb(i);
continue;
}
}
finalize:
A+=B;
B.clear();
if(A.size() + B.size() == n-1) break;
B+=T[A.size()+B.size()];
}
vector<int> ans;
for(int i = 0; i < m; i++) if(royal[i] == 1) ans.pb(i);
for(int nd = 0; nd < n; nd++){
basic_string<int> S;
for(auto [x, i]: graph[nd]) if(royal[i] == -1) S.pb(i);
if(S.empty()) continue;
int X = count_extra_royal(A, S);
while(X > 0){
int a = 1, b = S.size();
while(a < b){
int md = (a+b)/2;
if(count_extra_royal(A, S.substr(0, md)) >= X) b = md;
else a = md+1;
}
royal[S[a-1]] = 1;
ans.pb(S[a-1]);
X--;
}
for(int i: S) if(royal[i] == -1) royal[i] = 0;
}
return ans;
}
Compilation message
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:94:30: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
94 | if(A.size()+B.size() == n-1){
| ~~~~~~~~~~~~~~~~~~^~~~~~
simurgh.cpp:158:32: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
158 | if(A.size() + B.size() == n-1) break;
| ~~~~~~~~~~~~~~~~~~~~^~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
correct |
2 |
Correct |
1 ms |
212 KB |
correct |
3 |
Correct |
1 ms |
212 KB |
correct |
4 |
Correct |
1 ms |
212 KB |
correct |
5 |
Correct |
1 ms |
212 KB |
correct |
6 |
Correct |
1 ms |
212 KB |
correct |
7 |
Correct |
1 ms |
212 KB |
correct |
8 |
Correct |
1 ms |
212 KB |
correct |
9 |
Correct |
0 ms |
212 KB |
correct |
10 |
Correct |
1 ms |
212 KB |
correct |
11 |
Correct |
1 ms |
300 KB |
correct |
12 |
Correct |
0 ms |
212 KB |
correct |
13 |
Correct |
1 ms |
212 KB |
correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
correct |
2 |
Correct |
1 ms |
212 KB |
correct |
3 |
Correct |
1 ms |
212 KB |
correct |
4 |
Correct |
1 ms |
212 KB |
correct |
5 |
Correct |
1 ms |
212 KB |
correct |
6 |
Correct |
1 ms |
212 KB |
correct |
7 |
Correct |
1 ms |
212 KB |
correct |
8 |
Correct |
1 ms |
212 KB |
correct |
9 |
Correct |
0 ms |
212 KB |
correct |
10 |
Correct |
1 ms |
212 KB |
correct |
11 |
Correct |
1 ms |
300 KB |
correct |
12 |
Correct |
0 ms |
212 KB |
correct |
13 |
Correct |
1 ms |
212 KB |
correct |
14 |
Correct |
3 ms |
340 KB |
correct |
15 |
Correct |
4 ms |
340 KB |
correct |
16 |
Correct |
4 ms |
364 KB |
correct |
17 |
Correct |
3 ms |
340 KB |
correct |
18 |
Correct |
2 ms |
304 KB |
correct |
19 |
Correct |
3 ms |
340 KB |
correct |
20 |
Correct |
3 ms |
340 KB |
correct |
21 |
Correct |
3 ms |
340 KB |
correct |
22 |
Correct |
2 ms |
340 KB |
correct |
23 |
Correct |
1 ms |
340 KB |
correct |
24 |
Correct |
1 ms |
300 KB |
correct |
25 |
Correct |
1 ms |
212 KB |
correct |
26 |
Correct |
2 ms |
340 KB |
correct |
27 |
Correct |
2 ms |
328 KB |
correct |
28 |
Correct |
1 ms |
296 KB |
correct |
29 |
Correct |
1 ms |
212 KB |
correct |
30 |
Correct |
1 ms |
340 KB |
correct |
31 |
Correct |
2 ms |
340 KB |
correct |
32 |
Correct |
1 ms |
340 KB |
correct |
33 |
Correct |
1 ms |
340 KB |
correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
correct |
2 |
Correct |
1 ms |
212 KB |
correct |
3 |
Correct |
1 ms |
212 KB |
correct |
4 |
Correct |
1 ms |
212 KB |
correct |
5 |
Correct |
1 ms |
212 KB |
correct |
6 |
Correct |
1 ms |
212 KB |
correct |
7 |
Correct |
1 ms |
212 KB |
correct |
8 |
Correct |
1 ms |
212 KB |
correct |
9 |
Correct |
0 ms |
212 KB |
correct |
10 |
Correct |
1 ms |
212 KB |
correct |
11 |
Correct |
1 ms |
300 KB |
correct |
12 |
Correct |
0 ms |
212 KB |
correct |
13 |
Correct |
1 ms |
212 KB |
correct |
14 |
Correct |
3 ms |
340 KB |
correct |
15 |
Correct |
4 ms |
340 KB |
correct |
16 |
Correct |
4 ms |
364 KB |
correct |
17 |
Correct |
3 ms |
340 KB |
correct |
18 |
Correct |
2 ms |
304 KB |
correct |
19 |
Correct |
3 ms |
340 KB |
correct |
20 |
Correct |
3 ms |
340 KB |
correct |
21 |
Correct |
3 ms |
340 KB |
correct |
22 |
Correct |
2 ms |
340 KB |
correct |
23 |
Correct |
1 ms |
340 KB |
correct |
24 |
Correct |
1 ms |
300 KB |
correct |
25 |
Correct |
1 ms |
212 KB |
correct |
26 |
Correct |
2 ms |
340 KB |
correct |
27 |
Correct |
2 ms |
328 KB |
correct |
28 |
Correct |
1 ms |
296 KB |
correct |
29 |
Correct |
1 ms |
212 KB |
correct |
30 |
Correct |
1 ms |
340 KB |
correct |
31 |
Correct |
2 ms |
340 KB |
correct |
32 |
Correct |
1 ms |
340 KB |
correct |
33 |
Correct |
1 ms |
340 KB |
correct |
34 |
Correct |
168 ms |
1632 KB |
correct |
35 |
Correct |
169 ms |
1588 KB |
correct |
36 |
Correct |
121 ms |
1380 KB |
correct |
37 |
Correct |
18 ms |
404 KB |
correct |
38 |
Correct |
166 ms |
1616 KB |
correct |
39 |
Correct |
158 ms |
1500 KB |
correct |
40 |
Correct |
119 ms |
1372 KB |
correct |
41 |
Correct |
168 ms |
1628 KB |
correct |
42 |
Correct |
174 ms |
1628 KB |
correct |
43 |
Correct |
47 ms |
1084 KB |
correct |
44 |
Correct |
37 ms |
900 KB |
correct |
45 |
Correct |
42 ms |
976 KB |
correct |
46 |
Correct |
36 ms |
856 KB |
correct |
47 |
Correct |
19 ms |
596 KB |
correct |
48 |
Correct |
7 ms |
340 KB |
correct |
49 |
Correct |
11 ms |
316 KB |
correct |
50 |
Correct |
19 ms |
608 KB |
correct |
51 |
Correct |
40 ms |
972 KB |
correct |
52 |
Correct |
35 ms |
916 KB |
correct |
53 |
Correct |
33 ms |
852 KB |
correct |
54 |
Correct |
42 ms |
1108 KB |
correct |
55 |
Correct |
42 ms |
984 KB |
correct |
56 |
Correct |
37 ms |
980 KB |
correct |
57 |
Correct |
42 ms |
984 KB |
correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
correct |
2 |
Correct |
1 ms |
212 KB |
correct |
3 |
Correct |
742 ms |
3724 KB |
correct |
4 |
Correct |
1335 ms |
5060 KB |
correct |
5 |
Correct |
1346 ms |
4940 KB |
correct |
6 |
Correct |
1377 ms |
5048 KB |
correct |
7 |
Correct |
1370 ms |
5040 KB |
correct |
8 |
Correct |
1328 ms |
5060 KB |
correct |
9 |
Correct |
1413 ms |
5104 KB |
correct |
10 |
Correct |
1384 ms |
5032 KB |
correct |
11 |
Correct |
1365 ms |
5020 KB |
correct |
12 |
Correct |
1360 ms |
5048 KB |
correct |
13 |
Correct |
1 ms |
212 KB |
correct |
14 |
Correct |
1333 ms |
5120 KB |
correct |
15 |
Correct |
1408 ms |
5028 KB |
correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
correct |
2 |
Correct |
1 ms |
212 KB |
correct |
3 |
Correct |
1 ms |
212 KB |
correct |
4 |
Correct |
1 ms |
212 KB |
correct |
5 |
Correct |
1 ms |
212 KB |
correct |
6 |
Correct |
1 ms |
212 KB |
correct |
7 |
Correct |
1 ms |
212 KB |
correct |
8 |
Correct |
1 ms |
212 KB |
correct |
9 |
Correct |
0 ms |
212 KB |
correct |
10 |
Correct |
1 ms |
212 KB |
correct |
11 |
Correct |
1 ms |
300 KB |
correct |
12 |
Correct |
0 ms |
212 KB |
correct |
13 |
Correct |
1 ms |
212 KB |
correct |
14 |
Correct |
3 ms |
340 KB |
correct |
15 |
Correct |
4 ms |
340 KB |
correct |
16 |
Correct |
4 ms |
364 KB |
correct |
17 |
Correct |
3 ms |
340 KB |
correct |
18 |
Correct |
2 ms |
304 KB |
correct |
19 |
Correct |
3 ms |
340 KB |
correct |
20 |
Correct |
3 ms |
340 KB |
correct |
21 |
Correct |
3 ms |
340 KB |
correct |
22 |
Correct |
2 ms |
340 KB |
correct |
23 |
Correct |
1 ms |
340 KB |
correct |
24 |
Correct |
1 ms |
300 KB |
correct |
25 |
Correct |
1 ms |
212 KB |
correct |
26 |
Correct |
2 ms |
340 KB |
correct |
27 |
Correct |
2 ms |
328 KB |
correct |
28 |
Correct |
1 ms |
296 KB |
correct |
29 |
Correct |
1 ms |
212 KB |
correct |
30 |
Correct |
1 ms |
340 KB |
correct |
31 |
Correct |
2 ms |
340 KB |
correct |
32 |
Correct |
1 ms |
340 KB |
correct |
33 |
Correct |
1 ms |
340 KB |
correct |
34 |
Correct |
168 ms |
1632 KB |
correct |
35 |
Correct |
169 ms |
1588 KB |
correct |
36 |
Correct |
121 ms |
1380 KB |
correct |
37 |
Correct |
18 ms |
404 KB |
correct |
38 |
Correct |
166 ms |
1616 KB |
correct |
39 |
Correct |
158 ms |
1500 KB |
correct |
40 |
Correct |
119 ms |
1372 KB |
correct |
41 |
Correct |
168 ms |
1628 KB |
correct |
42 |
Correct |
174 ms |
1628 KB |
correct |
43 |
Correct |
47 ms |
1084 KB |
correct |
44 |
Correct |
37 ms |
900 KB |
correct |
45 |
Correct |
42 ms |
976 KB |
correct |
46 |
Correct |
36 ms |
856 KB |
correct |
47 |
Correct |
19 ms |
596 KB |
correct |
48 |
Correct |
7 ms |
340 KB |
correct |
49 |
Correct |
11 ms |
316 KB |
correct |
50 |
Correct |
19 ms |
608 KB |
correct |
51 |
Correct |
40 ms |
972 KB |
correct |
52 |
Correct |
35 ms |
916 KB |
correct |
53 |
Correct |
33 ms |
852 KB |
correct |
54 |
Correct |
42 ms |
1108 KB |
correct |
55 |
Correct |
42 ms |
984 KB |
correct |
56 |
Correct |
37 ms |
980 KB |
correct |
57 |
Correct |
42 ms |
984 KB |
correct |
58 |
Correct |
0 ms |
212 KB |
correct |
59 |
Correct |
1 ms |
212 KB |
correct |
60 |
Correct |
742 ms |
3724 KB |
correct |
61 |
Correct |
1335 ms |
5060 KB |
correct |
62 |
Correct |
1346 ms |
4940 KB |
correct |
63 |
Correct |
1377 ms |
5048 KB |
correct |
64 |
Correct |
1370 ms |
5040 KB |
correct |
65 |
Correct |
1328 ms |
5060 KB |
correct |
66 |
Correct |
1413 ms |
5104 KB |
correct |
67 |
Correct |
1384 ms |
5032 KB |
correct |
68 |
Correct |
1365 ms |
5020 KB |
correct |
69 |
Correct |
1360 ms |
5048 KB |
correct |
70 |
Correct |
1 ms |
212 KB |
correct |
71 |
Correct |
1333 ms |
5120 KB |
correct |
72 |
Correct |
1408 ms |
5028 KB |
correct |
73 |
Correct |
1 ms |
212 KB |
correct |
74 |
Correct |
1375 ms |
6040 KB |
correct |
75 |
Correct |
1337 ms |
5844 KB |
correct |
76 |
Correct |
424 ms |
2464 KB |
correct |
77 |
Correct |
1372 ms |
5980 KB |
correct |
78 |
Correct |
1359 ms |
5968 KB |
correct |
79 |
Correct |
1333 ms |
5964 KB |
correct |
80 |
Correct |
1304 ms |
5964 KB |
correct |
81 |
Correct |
1132 ms |
5316 KB |
correct |
82 |
Correct |
1347 ms |
5832 KB |
correct |
83 |
Correct |
752 ms |
3440 KB |
correct |
84 |
Correct |
338 ms |
4112 KB |
correct |
85 |
Correct |
323 ms |
3940 KB |
correct |
86 |
Correct |
224 ms |
2724 KB |
correct |
87 |
Correct |
165 ms |
2232 KB |
correct |
88 |
Correct |
142 ms |
1692 KB |
correct |
89 |
Correct |
134 ms |
1492 KB |
correct |
90 |
Correct |
116 ms |
1364 KB |
correct |
91 |
Correct |
44 ms |
480 KB |
correct |
92 |
Correct |
28 ms |
340 KB |
correct |
93 |
Correct |
324 ms |
3920 KB |
correct |
94 |
Correct |
217 ms |
2488 KB |
correct |
95 |
Correct |
208 ms |
2632 KB |
correct |
96 |
Correct |
134 ms |
1452 KB |
correct |
97 |
Correct |
141 ms |
1688 KB |
correct |
98 |
Correct |
167 ms |
2252 KB |
correct |
99 |
Correct |
153 ms |
1680 KB |
correct |
100 |
Correct |
64 ms |
656 KB |
correct |
101 |
Correct |
32 ms |
416 KB |
correct |
102 |
Correct |
287 ms |
3312 KB |
correct |
103 |
Correct |
297 ms |
3276 KB |
correct |
104 |
Correct |
299 ms |
3160 KB |
correct |
105 |
Correct |
282 ms |
3156 KB |
correct |