Submission #540484

#TimeUsernameProblemLanguageResultExecution timeMemory
540484elazarkorenFrom Hacks to Snitches (BOI21_watchmen)C++17
15 / 100
1282 ms143256 KiB
#include <bits/stdc++.h> #define x first #define y second #define all(v) v.begin(), v.end() #define chkmin(a, b) a = min(a, b) #define chkmax(a, b) a = max(a, b) using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vii; typedef vector<bool> vb; const int MAX_N = 1e5 + 5; const int MAX_L = 1e4; const int infinity = 1e9; int Gcd(int a, int b) { return (b ? Gcd(b, a % b) : a); } inline int Lcm(int a, int b) { return a * b / Gcd(a, b); } set<int> bad_node[MAX_L]; set<pii> bad_edge[MAX_L]; //queue<pii> q;//[MAX_L]; bitset<MAX_N> visited[MAX_L]; //int dist[MAX_N][MAX_L]; int cycle[MAX_N]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; vvi graph(n + 1); for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; graph[a].push_back(b); graph[b].push_back(a); } for (int i = 1; i <= n; i++) cycle[i] = 1; int k; cin >> k; vi len(k); vvi path(k); for (int j = 0; j < k; j++) { cin >> len[j]; path[j].resize(len[j] + 1); for (int i = 0; i < len[j]; i++) { cin >> path[j][i]; cycle[path[j][i]] = len[j]; } path[j][len[j]] = path[j][0]; for (int i = 1; i <= len[j]; i++) { bad_node[i % len[j]].insert(path[j][i]); bad_edge[i % len[j]].insert({min(path[j][i], path[j][i - 1]), max(path[j][i], path[j][i - 1])}); } } bitset<MAX_N> vis; for (int i = 1; i <= n; i++) { if (cycle[i] == 1) { vis[i] = true; for (int neighbor : graph[i]) { if (!vis[neighbor]) cycle[i] = Lcm(cycle[i], cycle[neighbor]); } } // for (int j = 0; j < cycle[i]; j++) dist[i][j] = infinity; } // priority_queue<pii, vii, greater<pii>> pq; queue<pii> pq; pq.push({1, 0}); while (!pq.empty()) { auto [node, d] = pq.front(); pq.pop(); if (visited[d % cycle[node]][node]) continue; visited[d % cycle[node]][node] = true; if (node == n) { cout << d << '\n'; return 0; } if (!bad_node[(d + 1) % cycle[node]].count(node)) { if (!visited[(d + 1) % cycle[node]][node]) { pq.push({node, d + 1}); } // if (d + 1 < dist[node][(d + 1) % cycle[node]]) { // dist[node][(d + 1) % cycle[node]] = d + 1; // pq.push({node, d + 1}); // } } for (int neighbor : graph[node]) { if (!bad_node[(d + 1) % cycle[neighbor]].count(neighbor)) { if (!bad_edge[(d + 1) % cycle[neighbor]].count({min(node, neighbor), max(node, neighbor)})) { if (!visited[(d + 1) % cycle[neighbor]][neighbor]) { pq.push({neighbor, d + 1}); } // if (d + 1 < dist[neighbor][(d + 1) % cycle[neighbor]]) { // dist[node][(d + 1) % cycle[neighbor]] = d + 1; // pq.push({neighbor, d + 1}); // } } } } } cout << "impossible\n"; return 0; } //6 6 //1 2 //2 3 //3 4 //4 5 //5 6 //2 4 //1 //3 2 3 4
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...