Submission #332422

#TimeUsernameProblemLanguageResultExecution timeMemory
332422AlexPop28Airline Route Map (JOI18_airline)C++11
100 / 100
1003 ms35708 KiB
#include "Alicelib.h" #include <vector> using namespace std; void Alice(int n, int m, int A[], int B[] ){ vector<pair<int, int>> edges; for (int i = 0; i < m; ++i) { edges.emplace_back(A[i], B[i]); } for (int bit = 0; bit < 10; ++bit) { for (int node = 0; node < n; ++node) { if (node & (1 << bit)) { edges.emplace_back(n + bit, node); } } } for (int node = 0; node < n; ++node) { edges.emplace_back(n + 10, node); } for (int bit = 1; bit < 10; ++bit) { edges.emplace_back(n + bit - 1, n + bit); edges.emplace_back(n + 11, n + bit); } InitG(n + 12, edges.size()); for (int i = 0; i < (int)edges.size(); ++i) { MakeG(i, edges[i].first, edges[i].second); } }
#include <bits/stdc++.h> #include "Boblib.h" #define dbg() cerr << #define name(x) (#x) << ": " << (x) << ' ' << using namespace std; bool Try(int n, int special0, const vector<vector<int>> &adj, const vector<pair<int, int>> &edges) { vector<bool> is_bit(n + 12, true); is_bit[special0] = false; for (int x : adj[special0]) { is_bit[x] = false; } vector<int> bits; for (int i = 0; i < n + 12; ++i) { if (is_bit[i]) bits.emplace_back(i); } assert((int)bits.size() == 11); int special1 = -1; for (int node : bits) { int bit_deg = 0; for (int x : adj[node]) { bit_deg += is_bit[x]; } if (bit_deg == 9) { if (special1 != -1) return false; special1 = node; } } if (special1 == -1) return false; // dbg() "Found " << name(special1) endl; is_bit[special1] = false; int zero = 0; for (int bit : bits) { if (is_bit[bit]) zero ^= bit; } for (int bit : adj[special1]) { zero ^= bit; } vector<int> order = {zero}; int node = zero; is_bit[zero] = false; for (int it = 0; it < 9; ++it) { int next = -1; for (int x : adj[node]) { if (is_bit[x]) { if (next != -1) return false; next = x; } } if (next == -1) return false; order.emplace_back(node = next); is_bit[node] = false; } for (int bit : order) is_bit[bit] = true; //, dbg() bit << " "; dbg() endl; is_bit[special0] = is_bit[special1] = true; vector<int> label(n + 12); for (int bit = 0; bit < 10; ++bit) { int node = order[bit]; for (int x : adj[node]) { if (!is_bit[x]) { label[x] |= 1 << bit; } } } vector<int> nodes; for (int i = 0; i < n + 12; ++i) { if (!is_bit[i]) nodes.emplace_back(label[i]); } sort(nodes.begin(), nodes.end()); if (n != (int)nodes.size()) return false; for (int i = 0; i < n; ++i) if (nodes[i] != i) return false; vector<pair<int, int>> new_edges; for (auto &p : edges) { int x, y; tie(x, y) = p; if (!is_bit[x] && !is_bit[y]) { new_edges.emplace_back(label[x], label[y]); } } sort(new_edges.begin(), new_edges.end()); // dbg() "Edges:\n"; // for (auto &p : new_edges) { // dbg() p.first << ' ' << p.second << endl; // } InitMap(n, new_edges.size()); for (auto &p : new_edges) { MakeMap(p.first, p.second); } return true; } void Bob(int V, int U, int C[], int D[]) { int n = V - 12; vector<vector<int>> adj(V); vector<pair<int, int>> edges; for (int i = 0; i < U; ++i) { int x = C[i], y = D[i]; edges.emplace_back(x, y); adj[x].emplace_back(y); adj[y].emplace_back(x); } for (int node = 0; node < V; ++node) { if ((int)adj[node].size() == n) { if (Try(n, node, adj, edges)) { return; } } } assert(false); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...