Submission #1266850

#TimeUsernameProblemLanguageResultExecution timeMemory
1266850trinm01Evacuation plan (IZhO18_plan)C++20
0 / 100
154 ms76832 KiB
// #pragma GCC optimize("O3") // #pragma GCC optimization("Ofast,unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include <bits/stdc++.h> using namespace std; #define int long long #define ll long long #define FOR(i, l, r) for (int i = (l); i <= (r); i++) #define FOD(i, r, l) for (int i = (r); i >= (l); i--) #define fi first #define se second #define pii pair<int, int> const ll mod = 1e9 + 7; const int MAXN = 5e5 + 5; const ll oo = 1e18+7; const int base = 10; int n, m, q, k; int a[MAXN]; vector<pii> adj[MAXN]; int f[MAXN]; void dijsktra(){ priority_queue<pii, vector<pii>, greater<pii>> q; FOR(i, 1, n){ f[i]=oo; } FOR(i, 1, k){ f[a[i]]=0; q.push({0, a[i]}); } while(!q.empty()){ auto [c, u]=q.top(); q.pop(); if(c>f[u]) continue; for(auto [v, w]:adj[u]){ if(f[v]>f[u]+w){ f[v]=f[u]+w; q.push({f[v], v}); } } } } struct edge{ int u, v, c; }cc[MAXN]; bool cmp(edge a, edge b){ return a.c<b.c; } int par[MAXN]; int find(int u){ if(par[u]==u){ return u; } return par[u]=find(par[u]); } int join(int u, int v){ u=find(u); v=find(v); if(u==v){ return 0; } par[v]=u; return 1; } vector<pii> adj1[MAXN]; int up[MAXN][20], st[MAXN][20], h[MAXN]; void dfs(int u, int p){ for(auto [v, w]:adj1[u]){ if(v==p) continue; h[v]=h[u]+1; up[v][0]=u; FOR(i, 1, 19){ up[v][i]=up[up[v][i-1]][i-1]; } st[v][0]=w; FOR(i, 1, 19){ st[v][i]=min(st[v][i-1], st[up[v][i-1]][i-1]); } dfs(v, u); } } int get(int u, int v){ int ans=oo; if(h[u]!=h[v]){ if(h[u]<h[v]){ swap(u, v); } int k=(h[u]-h[v]); FOR(i, 1, 19){ if((k>>i)&1){ ans=min(ans, st[u][i]); u=up[u][i]; } } } if(u==v){ return ans; } FOD(i, 19, 0){ if(up[u][i]!=up[v][i]){ ans=min({ans, st[u][i], st[v][i]}); u=up[u][i]; v=up[v][i]; } } return min({ans, st[u][0], st[v][0]}); } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); if(fopen(".inp", "r")){ freopen(".inp", "r", stdin); freopen(".out", "w", stdout); } cin >> n >> m; FOR(i, 1, m){ int u, v, c; cin >> u >> v >> c; adj[u].push_back({v, c}); adj[v].push_back({u, c}); cc[i]={u, v, 0}; } cin >> k; FOR(i, 1, k){ cin >> a[i]; } dijsktra(); // FOR(i, 1, n){ // cout << f[i] << ' '; // } // cout << '\n'; FOR(i, 1, m){ auto [u, v, c]=cc[i]; cc[i].c=min(f[u], f[v]); } sort(cc+1, cc+1+m, cmp); reverse(cc+1, cc+1+m); FOR(i, 1, n){ par[i]=i; } FOR(i, 1, m){ auto [u, v, c]=cc[i]; if(join(u, v)){ adj1[u].push_back({v, c}); adj1[v].push_back({u, c}); // cout << u << ' ' << v << ' ' << c << '\n'; } } FOR(i, 0, n+2){ FOR(j, 0, 19){ st[i][j]=oo; } } dfs(1, 0); cin >> q; FOR(i, 1, q){ int u, v; cin >> u >> v; cout << get(u, v) << '\n'; } return 0; }

Compilation message (stderr)

plan.cpp: In function 'int main()':
plan.cpp:122:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  122 |         freopen(".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
plan.cpp:123:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |         freopen(".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...