Submission #139852

#TimeUsernameProblemLanguageResultExecution timeMemory
139852ae04071Valley (BOI19_valley)C++11
100 / 100
400 ms22704 KiB
#include <bits/stdc++.h> using namespace std; using lli = long long; const lli INF = 1e17; struct seg_tr{ const static int MAX = 1<<17; lli tr[MAX<<1]; void init() { for(int i=0;i<MAX+MAX;i++) tr[i] = INF; } void upd(int cur,lli val) { cur+=MAX; tr[cur] = val; cur>>=1; while(cur) { int nx=cur<<1; tr[cur] = min(tr[nx],tr[nx+1]); cur>>=1; } } lli get(int l,int r) { lli ret = INF; l+=MAX; r+=MAX; while(l<=r) { ret = min({ret, tr[l],tr[r]}); if(l&1) l++; if(!(r&1)) r--; l>>=1; r>>=1; } return ret; } }st; lli mx[100001]; int dfn[100001],out[100001],dn=0,n,m,q,r,chk[100001]; vector<pair<int,int>> adj[100001]; lli ans[100001]; int de[100001]; vector<pair<int,int>> qa[100001]; void dfs(int cur,int p) { dfn[cur]=++dn; mx[cur] = INF; for(auto &it:adj[cur]) if(it.second!=p) { dfs(it.second,cur); mx[cur] = min(mx[cur], mx[it.second]+it.first); } if(chk[cur]) mx[cur] = 0; out[cur] = dn; } void dfs2(int cur,int p,int d,lli w) { st.upd(d, mx[cur]-w); de[cur]=d; for(auto &it:qa[cur]){ ans[it.second] = st.get(de[it.first], d) + w; } for(auto &it:adj[cur]) if(it.second != p) { dfs2(it.second,cur,d+1,w+it.first); } st.upd(d, INF); } struct edge{ int u,v,w; }ea[100001]; int main() { scanf("%d%d%d%d",&n,&m,&q,&r); for(int i=1;i<n;i++) { scanf("%d%d%d",&ea[i].u,&ea[i].v,&ea[i].w); adj[ea[i].u].push_back({ea[i].w,ea[i].v}); adj[ea[i].v].push_back({ea[i].w,ea[i].u}); } for(int i=0;i<m;i++) { int v; scanf("%d",&v); chk[v]=1; } dfs(r,0); for(int i=0;i<q;i++) { int a,b,u,v; scanf("%d%d",&a,&b); u = ea[a].u,v=ea[a].v; if(dfn[u]>dfn[v]) swap(u,v); if(dfn[b]<dfn[v] || dfn[b] > out[v]) ans[i] = -1; else qa[b].push_back({v,i}); } dfs2(r,0,0,0); for(int i=0;i<q;i++) { if(ans[i]==-1) puts("escaped"); else if(ans[i]>=INF/10) puts("oo"); else printf("%lld\n",ans[i]); } return 0; }

Compilation message (stderr)

valley.cpp: In function 'int main()':
valley.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d%d",&n,&m,&q,&r);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:71:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d",&ea[i].u,&ea[i].v,&ea[i].w);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:77:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&v);
         ~~~~~^~~~~~~~~
valley.cpp:84:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d",&a,&b);
         ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...