Submission #712815

#TimeUsernameProblemLanguageResultExecution timeMemory
712815TimDeeValley (BOI19_valley)C++17
100 / 100
194 ms29196 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx2,popcnt") #define int long long #define forn(i,n) for(size_t i=0;i<n;++i) #define pb push_back #define all(x) x.begin(),x.end() #define pi pair<int,int> #define f first #define s second const int inf=1e18; const int N=1e5; int sz[N],d[N],par[N],top[N],ind[N],rind[N]; int dist[N],dp[N]; int shop[N]; int z=0; vector<pi> adj[N]; pi e[N]; int W[N]; struct sgt { vector<int> t; int sz; sgt(int n) { sz=1; while(sz<n) sz<<=1; t.assign(2*sz,inf); } void upd(int v, int l, int r, int i) { if (r-l==1) return; int m=(l+r)>>1; if (i<m) upd(2*v+1,l,m,i); else upd(2*v+2,m,r,i); t[v]=min(t[2*v+1],t[2*v+2]); } void set(int i, int x) { t[sz-1+i]=x; upd(0,0,sz,i); } int q(int v, int l, int r, int lx, int rx) { if (rx<=l || r<=lx) return inf; if (lx<=l && r<=rx) return t[v]; int m=(l+r)>>1; int lq=q(2*v+1,l,m,lx,rx); int rq=q(2*v+2,m,r,lx,rx); return min(lq,rq); } int q(int l, int r) { if (l>=r) return inf; return q(0,0,sz,l,r); } }; sgt st(N); void dfs(int u, int p) { sz[u]=1; dp[u]=shop[u]?0:inf; for(auto&e:adj[u]) { int v=e.f, w=e.s; if (v==p) continue; d[v]=d[u]+1; dist[v]=dist[u]+w; par[v]=u; dfs(v,u); sz[u]+=sz[v]; dp[u]=min(dp[v]+w,dp[u]); } } void dfs(int u, int p, int t) { top[u]=t; rind[z]=u; ind[u]=z++; st.set(ind[u],(dp[u]==inf)?inf:(dp[u]-dist[u])); int mx=-1; for(auto&e:adj[u]) { int v=e.f, w=e.s; if (v==p) continue; if (mx==-1) mx=v; if (sz[v]>sz[mx]) mx=v; } if (mx==-1) return; dfs(mx,u,t); for(auto&e:adj[u]) { int v=e.f, w=e.s; if (v==p || v==mx) continue; dfs(v,u,v); } } int lca(int u, int v) { while (top[u]!=top[v]) { if (d[top[u]]<d[top[v]]) swap(u,v); u=par[top[u]]; } return (d[u]<d[v])?u:v; } int query(int u, int v) { int ret=inf; while (top[u]!=top[v]) { int q=st.q(ind[top[u]],ind[u]+1); ret=min(ret,q); u=par[top[u]]; } int q=st.q(ind[v],ind[u]+1); return min(ret,q); } void solve() { int n,s,q,E; cin>>n>>s>>q>>E; --E; forn(i,n-1) { int u,v,w; cin>>u>>v>>w; --u,--v; adj[u].pb({v,w}); adj[v].pb({u,w}); e[i]={u,v}; W[i]=w; } forn(i,s) { int u; cin>>u; --u; shop[u]=1; } dfs(E,-1); dfs(E,-1,E); //forn(i,n) cout<<dp[i]<<' '; cout<<'\n'; //forn(i,n) cout<<ind[i]<<' '; cout<<'\n'; //forn(i,n) forn(j,n) if (j>=i) cout<<i<<' '<<j<<' '<<st.q(i,j+1)<<'\n'; while (q--) { int i, x; cin>>i>>x; --i, --x; int u=e[i].f, v=e[i].s; if (par[u]==v) swap(u,v); if (lca(x,v)!=v) { cout<<"escaped\n"; continue; } int z=query(x,v); if (z==inf) cout<<"oo\n"; else cout<<z+dist[x]<<'\n'; } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t=1; //cin >> t; while (t--) solve(); return 0; }

Compilation message (stderr)

valley.cpp: In function 'void dfs(long long int, long long int, long long int)':
valley.cpp:82:14: warning: unused variable 'w' [-Wunused-variable]
   82 |   int v=e.f, w=e.s;
      |              ^
valley.cpp:90:14: warning: unused variable 'w' [-Wunused-variable]
   90 |   int v=e.f, w=e.s;
      |              ^
valley.cpp: In function 'void solve()':
valley.cpp:9:35: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
    9 | #define forn(i,n) for(size_t i=0;i<n;++i)
......
  118 |  forn(i,n-1) {
      |       ~~~~~                        
valley.cpp:118:2: note: in expansion of macro 'forn'
  118 |  forn(i,n-1) {
      |  ^~~~
valley.cpp:9:35: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
    9 | #define forn(i,n) for(size_t i=0;i<n;++i)
      |                                   ^
valley.cpp:125:2: note: in expansion of macro 'forn'
  125 |  forn(i,s) {
      |  ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...