Submission #1233119

#TimeUsernameProblemLanguageResultExecution timeMemory
1233119fermatEvacuation plan (IZhO18_plan)C++20
100 / 100
452 ms52096 KiB
#include <bits/stdc++.h> #define fr first #define sc second #define mk make_pair #define pb push_back #define sz(s) (int)s.size() #define all(s) s.begin(), s.end() using namespace std; const int N = 1e5 + 5; int n, m, x, y, w, ar[N], p[N], sz[N], up[20][N], mn[20][N], tin[N], tout[N], tiktak, h[N]; vector < vector <pair <int, int> > > g; vector < vector <int> > r; vector < pair <int, pair <int, int> > > vec; priority_queue <pair <int, int> > q; int get (int x) { return x == p[x] ? x : p[x] = get(p[x]); } void unite (int x, int y) { if (sz[x] > sz[y]) swap(x, y); sz[y] += sz[x]; p[x] = y; } void dfs (int v, int pr = 0) { h[v] = h[pr] + 1; tin[v] = ++tiktak; up[0][v] = pr; mn[0][v] = min(ar[pr], ar[v]); for (int i = 1; i < 20; i++) { up[i][v] = up[i - 1][ up[i - 1][v] ]; mn[i][v] = min( mn[i - 1][v], mn[i - 1][ up[i - 1][v] ] ); } for (auto to : r[v]) { if (to == pr) continue; dfs(to, v); } tout[v] = ++tiktak; } bool upper (int a, int b) { return tin[a] <= tin[b] && tout[b] <= tout[a]; } int lca (int a, int b) { if(upper(a, b)) return a; if(upper(b, a)) return b; for (int i = 19; i >= 0; i--) { if ( up[i][a] && !upper( up[i][a], b ) ) a = up[i][a]; } return up[0][a]; } int minjump(int v, int d) { if (d == 0) return ar[v]; int res = ar[v]; for (int i = 0; d; i++, d >>= 1) { if (d & 1) { res = min(res, mn[i][v]); v = up[i][v]; } } return res; } int ans (int a, int b) { int c = lca(a, b); return min( minjump( a, h[a] - h[c]), minjump( b, h[b] - h[c]) ); } main() { cin >> n >> m; g.resize(n + 1); r.resize(n + 1); for (int i = 1; i <= m; i++) { scanf("%d%d%d", &x, &y, &w); g[x].pb( mk(y, w) ); g[y].pb( mk(x, w) ); } memset( ar, 0x3f3f3f3f, sizeof(ar) ); cin >> m; for (int i = 1; i <= m; i++) { scanf("%d", &x); q.push( mk( 0, x ) ); ar[x] = 0; } while (!q.empty()) { w = -q.top().fr, x = q.top().sc; q.pop(); if (ar[x] < w) continue; for (auto to : g[x]) { if (ar[x] + to.sc < ar[to.fr]) { ar[to.fr] = ar[x] + to.sc; q.push( mk( -ar[to.fr], to.fr ) ); } } } for (int i = 1; i <= n; i++) { p[i] = i; sz[i] = 1; for (auto to : g[i]) vec.pb( mk( min( ar[i], ar[to.fr] ), mk( i, to.fr ) ) ); } sort( all(vec), greater < pair <int, pair <int, int> > >() ); for (auto it : vec) { x = it.sc.fr, y = it.sc.sc; if (get(x) != get(y)) { r[x].pb(y); r[y].pb(x); unite(get(x), get(y) ); } } dfs(1); cin >> m; while (m--) { scanf("%d%d", &x, &y); printf("%d\n", ans(x, y)); } }

Compilation message (stderr)

plan.cpp:89:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   89 | main()
      | ^~~~
plan.cpp: In function 'int main()':
plan.cpp:97:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |         scanf("%d%d%d", &x, &y, &w);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
plan.cpp:105:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  105 |         scanf("%d", &x);
      |         ~~~~~^~~~~~~~~~
plan.cpp:148:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  148 |         scanf("%d%d", &x, &y);
      |         ~~~~~^~~~~~~~~~~~~~~~
#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...