Submission #588558

#TimeUsernameProblemLanguageResultExecution timeMemory
588558M_WCrocodile's Underground City (IOI11_crocodile)C++17
100 / 100
515 ms91644 KiB
#include <bits/stdc++.h> #define ii pair<long long, long long> using namespace std; vector<ii> adj2[100001], adj[100001]; long long dist[100001][2]; int cnt[100001]; bitset<100001> mark; void dfs(int a, int p){ printf("!>> %d %d\n", a, p); mark[a] = 1; if(a != 0 && adj2[a].size() <= 2) return; for(auto [x, w] : adj2[a]){ if(x == p) continue; adj[a].push_back({x, w}); adj[x].push_back({a, w}); if(!mark[x]) dfs(x, a); } } int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]) { for(int i = 0; i < M; i++){ adj[R[i][0]].push_back({R[i][1], L[i]}); adj[R[i][1]].push_back({R[i][0], L[i]}); } // dfs(0, 0); priority_queue<ii, vector<ii>, greater<ii>> pq; for(int i = 0; i < N; i++) dist[i][0] = dist[i][1] = LLONG_MAX; for(int i = 0; i < K; i++){ if(1 | mark[P[i]]){ pq.push({0, P[i]}); dist[P[i]][0] = dist[P[i]][1] = 0; } } while(!pq.empty()){ auto [d, n] = pq.top(); pq.pop(); // printf(">> %d : %lld %lld\n", n, dist[n][0], dist[n][1]); if(dist[n][1] != d) continue; for(auto [x, w] : adj[n]){ if(dist[x][0] > dist[n][1] + w){ if(dist[x][1] > dist[x][0]){ dist[x][1] = dist[x][0]; pq.push({dist[x][1], x}); } dist[x][0] = dist[n][1] + w; } else if(dist[x][1] > dist[n][1] + w){ dist[x][1] = dist[n][1] + w; pq.push({dist[x][1], x}); } } } return dist[0][1]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...