Submission #404523

#TimeUsernameProblemLanguageResultExecution timeMemory
404523dooweyFrom Hacks to Snitches (BOI21_watchmen)C++14
0 / 100
108 ms38468 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair #define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N = 250110; const int inf = (int)1e9; vector<int> T[N]; int id[N]; int mod[N]; int ash[N]; vector<int> ord[N]; vector<int> dp[N]; vector<bool> vis[N]; struct item{ int dist; int node; int inv; bool operator<(const item &q) const { return dist > q.dist; } }; int main(){ fastIO; int n, m; cin >> n >> m; int ui, vi; for(int i = 1; i <= m; i ++ ){ cin >> ui >> vi; T[ui].push_back(vi); T[vi].push_back(ui); } int k; cin >> k; int sz; for(int iq = 1; iq <= k ; iq ++ ){ cin >> sz; for(int j = 0; j < sz; j ++ ){ cin >> ui; ash[ui] = j; mod[ui] = sz; id[ui] = iq; ord[iq].push_back(ui); } } for(int i = 1; i <= n; i ++ ){ if(id[i] == 0){ vis[i].resize(1, false); dp[i].resize(1, inf); } else{ vis[i].resize(mod[i], false); dp[i].resize(mod[i], inf); } } priority_queue<item> pq; dp[1][0] = 0; pq.push({0, 1, 0}); int node; int iinv; int dis; int ban0, ban1; int nex; while(!pq.empty()){ dis = pq.top().dist; node = pq.top().node; iinv = pq.top().inv; pq.pop(); if(vis[node][iinv]) continue; vis[node][iinv] = true; if(id[node] == 0){ for(auto x : T[node]){ if(id[x] == 0){ if(dp[x][0] > dis + 1){ dp[x][0] = dis + 1; pq.push({dp[x][0], x, 0}); } } else{ for(int wait = 1; wait <= mod[x]; wait ++ ){ if(ord[id[x]][(wait + dis) % mod[x]] != x && dp[x][(wait + dis) % mod[x]] > dis + wait){ dp[x][(wait + dis) % mod[x]] = dis + wait; pq.push({dp[x][(wait + dis) % mod[x]], x, (wait + dis) % mod[x]}); } } } } } else{ for(auto x : T[node]){ if(id[x] == 0){ if(dp[x][0] > dis + 1){ dp[x][0] = dis + 1; pq.push({dp[x][0], x, 0}); } } else if(id[x] == id[node]){ if((ash[x] + 1) % mod[x] != ash[node] && ord[id[x]][(dis + 1) % mod[x]] != x){ if(dp[x][(dis + 1) % mod[x]] > dis + 1){ dp[x][(dis + 1) % mod[x]] = dis + 1; pq.push({dis + 1, x, (dis + 1) % mod[x]}); } } } } ban0 = ord[id[node]][iinv]; ban1 = ord[id[node]][(iinv + 1 + mod[node]) % mod[node]]; nex = ord[id[node]][(ash[node] + 1) % mod[node]]; if(dp[nex][(iinv + 1) % mod[nex]] > dis + 1){ dp[nex][(iinv + 1) % mod[nex]] = dis + 1; pq.push({dis + 1, nex, (iinv + 1) % mod[nex]}); } nex = ord[id[node]][(ash[node] - 1 + mod[node]) % mod[node]]; if(dp[nex][(iinv + 1) % mod[nex]] > dis + 1){ dp[nex][(iinv + 1) % mod[nex]] = dis + 1; pq.push({dis + 1, nex, (iinv + 1) % mod[nex]}); } } } if(dp[n][0] < inf) cout << dp[n][0] << "\n"; else cout << "impossible\n"; return 0; }

Compilation message (stderr)

watchmen.cpp: In function 'int main()':
watchmen.cpp:71:9: warning: variable 'ban0' set but not used [-Wunused-but-set-variable]
   71 |     int ban0, ban1;
      |         ^~~~
watchmen.cpp:71:15: warning: variable 'ban1' set but not used [-Wunused-but-set-variable]
   71 |     int ban0, ban1;
      |               ^~~~
#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...