#include <algorithm>
#include <cassert>
#include <functional>
#include <iostream>
#include <numeric>
#include <random>
#include <set>
#include <utility>
#include <vector>
#include "longesttrip.h"
using namespace std;
bool safe_are_connected(vector<int> S_left, vector<int> S_right) {
if(S_left.size() == 0 || S_right.size() == 0) return false;
return are_connected(S_left, S_right);
}
vector<vector<int>> create_adj(
int N, vector<int> nodes, vector<pair<int, int>> edges
) {
vector<vector<int>> adj(N);
vector<bool> in_nodes(N, false);
for(auto n: nodes) in_nodes[n] = true;
for(auto e: edges) {
if(!in_nodes[e.first] || !in_nodes[e.second]) continue;
adj[e.first].push_back(e.second);
adj[e.second].push_back(e.first);
}
return adj;
}
void add_edge(int u, int v, vector<set<int>> &adj_set) {
adj_set[u].insert(v);
adj_set[v].insert(u);
}
void remove_edge(int u, int v, vector<set<int>> &adj_set) {
adj_set[u].erase(v);
adj_set[v].erase(u);
}
int only_par(int u, vector<set<int>> &adj_set, int from = -1) {
assert(adj_set[u].size() <= 2);
for(auto nei: adj_set[u]) {
if(nei != from) return nei;
}
return -1;
}
void prune_tree(
int l1, int l2, int l3, vector<int> &leaves, vector<set<int>> &adj_set
) {
leaves.push_back(l3);
int u = l1, v = l2;
while(adj_set[u].size() == 1) {
int pu = only_par(u, adj_set);
remove_edge(u, pu, adj_set);
add_edge(v, u, adj_set);
v = u;
u = pu;
}
leaves.push_back(v);
}
vector<int> solve_tree(int N, vector<int> nodes, vector<vector<int>> adj) {
vector<set<int>> adj_set(N);
for(int i = 0; i < N; i++) {
adj_set[i] = set<int>(adj[i].begin(), adj[i].end());
}
// We assume that the tree is connected here
vector<int> leaves;
for(auto node: nodes) {
if(adj_set[node].size() == 1) {
leaves.push_back(node);
}
}
mt19937 mt(42);
while(leaves.size() >= 3) {
shuffle(leaves.begin(), leaves.end(), mt);
int l1 = leaves.back();
leaves.pop_back();
int l2 = leaves.back();
leaves.pop_back();
int l3 = leaves.back();
leaves.pop_back();
if(are_connected({l1}, {l2})) {
prune_tree(l1, l2, l3, leaves, adj_set);
} else if(are_connected({l1}, {l3})) {
prune_tree(l1, l3, l2, leaves, adj_set);
} else {
// Delta >= 1, means that l2 and l3 are connected
prune_tree(l2, l3, l1, leaves, adj_set);
}
}
// for(auto node: nodes) {
// cerr << node << "| ";
// for(auto nei: adj_set[node]) {
// cerr << nei << " ";
// }
// cerr << endl;
// }
// It's a path
vector<int> path;
vector<bool> used(N, false);
int u = leaves[0];
int last = -1;
while(u != -1) {
path.push_back(u);
used[u] = true;
int nlast = u;
u = only_par(u, adj_set, last);
last = nlast;
}
if(leaves.size() == 2) {
u = leaves[1];
vector<int> rev_path;
while(!used[u]) {
rev_path.push_back(u);
int nlast = u;
u = only_par(u, adj_set, last);
last = nlast;
}
reverse(rev_path.begin(), rev_path.end());
path.insert(path.end(), rev_path.begin(), rev_path.end());
}
return path;
}
pair<int, int> find_one_edge(
vector<int> S_left, vector<int> S_right, mt19937 &mt
) {
assert(S_left.size() >= 1 && S_right.size() >= 1);
if(S_left.size() == 1 && S_right.size() == 1) {
return {S_left[0], S_right[0]};
}
shuffle(S_left.begin(), S_left.end(), mt);
shuffle(S_right.begin(), S_right.end(), mt);
int mid_left = S_left.size() / 2;
int mid_right = S_right.size() / 2;
vector<int> left_left(S_left.begin(), S_left.begin() + mid_left);
vector<int> left_right(S_left.begin() + mid_left, S_left.end());
vector<int> right_left(S_right.begin(), S_right.begin() + mid_right);
vector<int> right_right(S_right.begin() + mid_right, S_right.end());
if(safe_are_connected(left_left, right_left)) {
return find_one_edge(left_left, right_left, mt);
} else if(safe_are_connected(left_left, right_right)) {
return find_one_edge(left_left, right_right, mt);
} else if(safe_are_connected(left_right, right_left)) {
return find_one_edge(left_right, right_left, mt);
} else {
return find_one_edge(left_right, right_right, mt);
}
}
vector<int> longest_trip(int N, int D) {
assert(D >= 1);
vector<int> comps[2];
vector<pair<int, int>> edges;
vector<int> order(N);
iota(order.begin(), order.end(), 0);
mt19937 mt(42);
shuffle(order.begin(), order.end(), mt);
comps[0].push_back(order[0]);
int other = 1;
while(other < N && are_connected({order[0]}, {order[other]})) {
comps[0].push_back(order[other]);
edges.push_back({order[0], order[other]});
other++;
}
if(other == N) {
vector<int> all_nodes(N);
iota(all_nodes.begin(), all_nodes.end(), 0);
auto adj = create_adj(N, all_nodes, edges);
// cerr << "Solving tree" << endl;
return solve_tree(N, all_nodes, adj);
} else {
// Maybe we have two components
comps[1].push_back(order[other]);
// cerr << "Other: ";
// cerr << order[other] << endl;
for(int i = other + 1; i < N; i++) {
if(are_connected({order[0]}, {order[i]})) {
comps[0].push_back(order[i]);
edges.push_back({order[0], order[i]});
} else {
comps[1].push_back(order[i]);
edges.push_back({order[other], order[i]});
}
}
// cerr << "Comps:" << endl;
// for(int i = 0; i < 2; i++) {
// for(int j = 0; j < comps[i].size(); j++) {
// cerr << comps[i][j] << " ";
// }
// cerr << endl;
// }
// Check if this is one component
if(are_connected(comps[0], comps[1])) {
edges.push_back(find_one_edge(comps[0], comps[1], mt));
vector<int> all_nodes(N);
iota(all_nodes.begin(), all_nodes.end(), 0);
auto adj = create_adj(N, all_nodes, edges);
return solve_tree(N, all_nodes, adj);
}
// Two disjoint paths, so just get the longer one
if(comps[0].size() < comps[1].size()) swap(comps[0], comps[1]);
auto adj = create_adj(N, comps[0], edges);
return solve_tree(N, comps[0], adj);
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
596 KB |
Output is correct |
2 |
Correct |
4 ms |
700 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
7 ms |
344 KB |
Output is correct |
2 |
Correct |
10 ms |
344 KB |
Output is correct |
3 |
Correct |
9 ms |
344 KB |
Output is correct |
4 |
Correct |
10 ms |
344 KB |
Output is correct |
5 |
Correct |
12 ms |
344 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
344 KB |
Output is correct |
2 |
Correct |
8 ms |
344 KB |
Output is correct |
3 |
Correct |
10 ms |
596 KB |
Output is correct |
4 |
Correct |
10 ms |
344 KB |
Output is correct |
5 |
Correct |
12 ms |
600 KB |
Output is correct |
6 |
Correct |
10 ms |
344 KB |
Output is correct |
7 |
Correct |
14 ms |
344 KB |
Output is correct |
8 |
Correct |
11 ms |
344 KB |
Output is correct |
9 |
Correct |
10 ms |
344 KB |
Output is correct |
10 |
Correct |
11 ms |
444 KB |
Output is correct |
11 |
Correct |
11 ms |
864 KB |
Output is correct |
12 |
Correct |
12 ms |
932 KB |
Output is correct |
13 |
Correct |
11 ms |
448 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
7 ms |
344 KB |
Output is correct |
2 |
Correct |
10 ms |
344 KB |
Output is correct |
3 |
Correct |
9 ms |
600 KB |
Output is correct |
4 |
Correct |
9 ms |
344 KB |
Output is correct |
5 |
Correct |
11 ms |
344 KB |
Output is correct |
6 |
Correct |
9 ms |
344 KB |
Output is correct |
7 |
Correct |
13 ms |
344 KB |
Output is correct |
8 |
Correct |
10 ms |
344 KB |
Output is correct |
9 |
Correct |
10 ms |
344 KB |
Output is correct |
10 |
Correct |
11 ms |
448 KB |
Output is correct |
11 |
Correct |
10 ms |
448 KB |
Output is correct |
12 |
Correct |
11 ms |
704 KB |
Output is correct |
13 |
Correct |
12 ms |
1028 KB |
Output is correct |
14 |
Correct |
10 ms |
344 KB |
Output is correct |
15 |
Correct |
8 ms |
344 KB |
Output is correct |
16 |
Correct |
13 ms |
344 KB |
Output is correct |
17 |
Correct |
10 ms |
596 KB |
Output is correct |
18 |
Correct |
11 ms |
344 KB |
Output is correct |
19 |
Correct |
12 ms |
344 KB |
Output is correct |
20 |
Correct |
11 ms |
344 KB |
Output is correct |
21 |
Correct |
12 ms |
532 KB |
Output is correct |
22 |
Correct |
13 ms |
604 KB |
Output is correct |
23 |
Correct |
12 ms |
700 KB |
Output is correct |
24 |
Correct |
11 ms |
440 KB |
Output is correct |
25 |
Correct |
9 ms |
344 KB |
Output is correct |
26 |
Correct |
8 ms |
344 KB |
Output is correct |
27 |
Correct |
10 ms |
344 KB |
Output is correct |
28 |
Correct |
10 ms |
344 KB |
Output is correct |
29 |
Correct |
9 ms |
344 KB |
Output is correct |
30 |
Correct |
9 ms |
440 KB |
Output is correct |
31 |
Correct |
9 ms |
500 KB |
Output is correct |
32 |
Correct |
7 ms |
696 KB |
Output is correct |
33 |
Correct |
10 ms |
344 KB |
Output is correct |
34 |
Correct |
10 ms |
344 KB |
Output is correct |
35 |
Correct |
9 ms |
344 KB |
Output is correct |
36 |
Correct |
11 ms |
448 KB |
Output is correct |
37 |
Correct |
11 ms |
448 KB |
Output is correct |
38 |
Correct |
10 ms |
444 KB |
Output is correct |
39 |
Correct |
8 ms |
448 KB |
Output is correct |
40 |
Correct |
8 ms |
444 KB |
Output is correct |
41 |
Correct |
9 ms |
600 KB |
Output is correct |
42 |
Correct |
8 ms |
344 KB |
Output is correct |
43 |
Correct |
7 ms |
448 KB |
Output is correct |
44 |
Correct |
7 ms |
600 KB |
Output is correct |
45 |
Correct |
10 ms |
344 KB |
Output is correct |
46 |
Correct |
11 ms |
344 KB |
Output is correct |
47 |
Correct |
12 ms |
344 KB |
Output is correct |
48 |
Correct |
15 ms |
344 KB |
Output is correct |
49 |
Correct |
13 ms |
344 KB |
Output is correct |
50 |
Correct |
12 ms |
636 KB |
Output is correct |
51 |
Correct |
15 ms |
596 KB |
Output is correct |
52 |
Correct |
12 ms |
692 KB |
Output is correct |
53 |
Correct |
11 ms |
344 KB |
Output is correct |
54 |
Correct |
13 ms |
600 KB |
Output is correct |
55 |
Correct |
11 ms |
344 KB |
Output is correct |
56 |
Correct |
12 ms |
704 KB |
Output is correct |
57 |
Correct |
11 ms |
444 KB |
Output is correct |
58 |
Correct |
14 ms |
444 KB |
Output is correct |
59 |
Correct |
15 ms |
696 KB |
Output is correct |
60 |
Correct |
16 ms |
444 KB |
Output is correct |
61 |
Correct |
13 ms |
864 KB |
Output is correct |
62 |
Correct |
13 ms |
516 KB |
Output is correct |
63 |
Correct |
14 ms |
600 KB |
Output is correct |
64 |
Correct |
15 ms |
600 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
7 ms |
344 KB |
Output is correct |
2 |
Correct |
11 ms |
344 KB |
Output is correct |
3 |
Correct |
9 ms |
344 KB |
Output is correct |
4 |
Correct |
10 ms |
600 KB |
Output is correct |
5 |
Partially correct |
11 ms |
344 KB |
Output is partially correct |
6 |
Correct |
10 ms |
344 KB |
Output is correct |
7 |
Correct |
16 ms |
600 KB |
Output is correct |
8 |
Correct |
11 ms |
344 KB |
Output is correct |
9 |
Correct |
10 ms |
344 KB |
Output is correct |
10 |
Partially correct |
13 ms |
700 KB |
Output is partially correct |
11 |
Partially correct |
11 ms |
700 KB |
Output is partially correct |
12 |
Partially correct |
12 ms |
852 KB |
Output is partially correct |
13 |
Partially correct |
12 ms |
852 KB |
Output is partially correct |
14 |
Correct |
10 ms |
344 KB |
Output is correct |
15 |
Correct |
10 ms |
596 KB |
Output is correct |
16 |
Correct |
12 ms |
344 KB |
Output is correct |
17 |
Correct |
13 ms |
344 KB |
Output is correct |
18 |
Correct |
10 ms |
344 KB |
Output is correct |
19 |
Correct |
11 ms |
344 KB |
Output is correct |
20 |
Correct |
13 ms |
756 KB |
Output is correct |
21 |
Correct |
9 ms |
344 KB |
Output is correct |
22 |
Correct |
10 ms |
344 KB |
Output is correct |
23 |
Correct |
8 ms |
344 KB |
Output is correct |
24 |
Correct |
9 ms |
344 KB |
Output is correct |
25 |
Correct |
9 ms |
344 KB |
Output is correct |
26 |
Correct |
10 ms |
696 KB |
Output is correct |
27 |
Correct |
9 ms |
436 KB |
Output is correct |
28 |
Correct |
7 ms |
692 KB |
Output is correct |
29 |
Correct |
9 ms |
344 KB |
Output is correct |
30 |
Correct |
10 ms |
600 KB |
Output is correct |
31 |
Correct |
9 ms |
344 KB |
Output is correct |
32 |
Correct |
10 ms |
344 KB |
Output is correct |
33 |
Correct |
11 ms |
344 KB |
Output is correct |
34 |
Correct |
11 ms |
344 KB |
Output is correct |
35 |
Correct |
12 ms |
344 KB |
Output is correct |
36 |
Correct |
13 ms |
344 KB |
Output is correct |
37 |
Correct |
12 ms |
444 KB |
Output is correct |
38 |
Correct |
12 ms |
440 KB |
Output is correct |
39 |
Correct |
12 ms |
464 KB |
Output is correct |
40 |
Correct |
10 ms |
344 KB |
Output is correct |
41 |
Correct |
11 ms |
344 KB |
Output is correct |
42 |
Correct |
14 ms |
344 KB |
Output is correct |
43 |
Partially correct |
12 ms |
608 KB |
Output is partially correct |
44 |
Partially correct |
11 ms |
448 KB |
Output is partially correct |
45 |
Partially correct |
11 ms |
448 KB |
Output is partially correct |
46 |
Partially correct |
12 ms |
604 KB |
Output is partially correct |
47 |
Partially correct |
12 ms |
856 KB |
Output is partially correct |
48 |
Partially correct |
12 ms |
856 KB |
Output is partially correct |
49 |
Partially correct |
11 ms |
448 KB |
Output is partially correct |
50 |
Partially correct |
9 ms |
860 KB |
Output is partially correct |
51 |
Partially correct |
8 ms |
600 KB |
Output is partially correct |
52 |
Correct |
7 ms |
600 KB |
Output is correct |
53 |
Correct |
7 ms |
340 KB |
Output is correct |
54 |
Correct |
7 ms |
444 KB |
Output is correct |
55 |
Correct |
7 ms |
620 KB |
Output is correct |
56 |
Partially correct |
11 ms |
704 KB |
Output is partially correct |
57 |
Partially correct |
10 ms |
604 KB |
Output is partially correct |
58 |
Partially correct |
10 ms |
704 KB |
Output is partially correct |
59 |
Partially correct |
8 ms |
704 KB |
Output is partially correct |
60 |
Correct |
7 ms |
340 KB |
Output is correct |
61 |
Correct |
8 ms |
344 KB |
Output is correct |
62 |
Partially correct |
11 ms |
704 KB |
Output is partially correct |
63 |
Partially correct |
11 ms |
444 KB |
Output is partially correct |
64 |
Partially correct |
12 ms |
448 KB |
Output is partially correct |
65 |
Partially correct |
15 ms |
440 KB |
Output is partially correct |
66 |
Partially correct |
15 ms |
600 KB |
Output is partially correct |
67 |
Partially correct |
14 ms |
860 KB |
Output is partially correct |
68 |
Partially correct |
13 ms |
448 KB |
Output is partially correct |
69 |
Partially correct |
13 ms |
444 KB |
Output is partially correct |
70 |
Partially correct |
15 ms |
856 KB |
Output is partially correct |
71 |
Partially correct |
14 ms |
604 KB |
Output is partially correct |
72 |
Partially correct |
13 ms |
604 KB |
Output is partially correct |
73 |
Partially correct |
16 ms |
856 KB |
Output is partially correct |
74 |
Partially correct |
13 ms |
448 KB |
Output is partially correct |
75 |
Partially correct |
14 ms |
672 KB |
Output is partially correct |
76 |
Partially correct |
14 ms |
448 KB |
Output is partially correct |
77 |
Partially correct |
14 ms |
604 KB |
Output is partially correct |
78 |
Partially correct |
14 ms |
604 KB |
Output is partially correct |
79 |
Partially correct |
13 ms |
700 KB |
Output is partially correct |
80 |
Partially correct |
14 ms |
444 KB |
Output is partially correct |
81 |
Partially correct |
12 ms |
704 KB |
Output is partially correct |
82 |
Partially correct |
14 ms |
524 KB |
Output is partially correct |