Submission #771772

#TimeUsernameProblemLanguageResultExecution timeMemory
771772LittleCubeFrom Hacks to Snitches (BOI21_watchmen)C++17
0 / 100
396 ms185456 KiB
#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> #define ll long long #define state tuple<ll, int, int, int> #define F first #define S second using namespace std; int N, M, K, L, l[2500005], r[2500005], nxt[2500005], mp[2000]; ll cnt = 0; vector<int> v[2000]; vector<ll> dis[2500005]; vector<bitset<128>> vis[2500005]; vector<int> E[2500005]; bool good(int u, ll t) { return r[u] == 0 || t % l[u] != r[u]; } bool goodmove(int u, int v, ll t) { if (u == nxt[v]) return good(u, t) && good(v, t); else return good(v, t); } signed main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> N >> M; for (int i = 1; i <= M; i++) { int u, v; cin >> u >> v; E[u].emplace_back(v); E[v].emplace_back(u); } for (int i = 1; i <= N; i++) l[i] = 1; cin >> K; for (int i = 1; i <= K; i++) { int k; cin >> k; if (mp[k] == 0) mp[k] = ++L; v[i].resize(k); for (int j = 0; j < k; j++) { cin >> v[i][j]; l[v[i][j]] = k; r[v[i][j]] = j; vis[v[i][j]].resize(k); } for (int j = 0; j < l[i]; j++) nxt[v[i][j]] = v[i][(j + 1) % l[i]]; } assert(L < 128); for (int i = 1; i <= N; i++) dis[i].resize(l[i], (ll)1e18); dis[1][0] = 0; priority_queue<state, vector<state>, greater<state>> pq; pq.push(state{0, 1, 0, 0}); while (!pq.empty()) { auto [d, u, k, b] = pq.top(); pq.pop(); if (!b && d > dis[u][k]) continue; if (!b) { for (auto v : E[u]) if (r[v] == 0 && d + 1 < dis[v][0]) { dis[v][0] = d + 1; pq.push(state{d + 1, v, 0, 0}); } else if (r[v]) { if (!goodmove(u, v, d + 1) && l[u] % l[v] == 0) continue; pq.push(state{d, u, k, v}); } int rem = (d + 1) % l[u]; if (good(u, d + 1) && dis[u][rem] > d + 1) { dis[u][rem] = d + 1; pq.push(state{d + 1, u, rem, 0}); } } else { cnt++; // u -> b int rem = (d + 1) % l[b]; if (vis[b][rem][mp[l[u]]]) continue; if (goodmove(u, b, d + 1)) { if (dis[b][rem] > d + 1) { dis[b][rem] = d + 1; pq.push(state{d + 1, b, rem, 0}); } } vis[b][rem][mp[l[u]]] = 1; pq.push(state{d + l[u], u, k, b}); } } // for (int i = 1; i <= N; i++) // { // cout << i << ":"; // for (auto j : dis[i]) // cout << ' ' << j; // cout << '\n'; // } cerr << "update counter " << cnt << '\n'; if (dis[N][0] >= 1e18) cout << "impossible\n"; else cout << dis[N][0] << '\n'; }
#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...