Submission #1133276

#TimeUsernameProblemLanguageResultExecution timeMemory
1133276friedelValley (BOI19_valley)C++20
100 / 100
217 ms49280 KiB
#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; using llu=unsigned long long; using ll=long long; using ld=long double; using pir=pair<ll,ll>; using vl=vector<ll>; using sl=set<ll>; using msl=multiset<ll>; using prq=priority_queue<ll>; using prqi=priority_queue<ll,vector<ll>,greater<ll>>; using ma=map<ll,ll>; using vp=vector<pair<ll,ll>>; using vvl=vector<vector<ll>>; using vvp=vector<vector<pair<ll,ll>>>; using sp=set<pair<ll,ll>>; using msp=multiset<pair<ll,ll>>; #define nfs string::npos #define count1(n) __builtin_popcountll(n) #define last1(n) __builtin_ctzll(n) #define first1(n) 63-__builtin_clzll(n) #define maxi(v) max_element(all(v)) #define mini(v) min_element(all(v)) #define lb(n) lower_bound(n) #define ub(n) upper_bound(n) #define lbd(v,n) lower_bound(all(v),n) #define ubd(v,n) upper_bound(all(v),n) #define bins(v,n) binary_search(all(v),n) #define fr(i,a,b) for(i=a;i<=b;i++) #define fv(i,a,b) for(i=a;i>=b;i--) #define f(i,n) for(i=0;i<n;i++) #define fn(i,n) for(i=n-1;i>=0;i--) #define pb push_back #define ppb pop_back #define all(v) v.begin(),v.end() #define g(v,n) vl v(n); f(_,n) cin>>v[_] #define bs(n,x) bitset<n> (x).to_string() #define invp(v,n) vp v;f(_,n) cin>>v[_].first>>v[_].second #define seev(v) for(auto ggg:v) cout<<ggg<<"-" #define print(v) for(auto ggg:v) cout<<ggg<<" " const ll inf=4e18; const ll mod=1000000007; const ll mod2=998244353; ll power(ll a,ll b,ll p=inf) { ll res=1;a%=p; while(b>0) { if(b%2==1) res=(res*a)%p; a=(a*a)%p; b=b/2; } return res; } ll log(ll n,ll k) { ll a=k,b=0; while(a<=n) a*=k,b++; return b; } ll todec(ll n,string s) { ll i,k=0; f(i,n) if(s[i]=='1') k+=1LL<<(n-i-1); return k; } bool vps(const pair<ll,ll> &a,const pair<ll,ll> &b) { return (a.second<b.second); } bool fts(const pair<ll,ll> &a,const pair<ll,ll> &b) { if(a.first!=b.first) return (a.first<b.first); return (a.second>b.second); } vl segtree(vl& v) { ll i,n=v.size(); ll p=power(2,log(n-1,2)+1); f(i,p-n) v.pb(0); n=v.size(); vl sgt(2*n); fr(i,n,2*n-1) sgt[i]=v[i-n]; fn(i,n) sgt[i]=max(sgt[2*i],sgt[2*i+1]); return sgt; } void update(vl& sgt,ll k,ll x) { ll n=sgt.size()/2;k+=n; sgt[k]=x; for(k=k/2;k>0;k/=2) sgt[k]=max(sgt[2*k],sgt[2*k+1]); } ll query(vl& sgt,ll l,ll r) { ll n=sgt.size()/2,q=-inf; l+=n;r+=n; while(l<=r) { if(l%2==1) q=max(q,sgt[l++]); if(r%2==0) q=max(q,sgt[r--]); l/=2;r/=2; } return q; } vl level(vvp& v,ll root) { ll n=v.size()-1; vl lvl(n+1),vt(n+1); function<void(ll)> dfs=[&](ll nd) { vt[nd]=1; for(auto g:v[nd]) { if(vt[g.first]) continue; lvl[g.first]=lvl[nd]+1; dfs(g.first); } }; dfs(root); return lvl; } pir merge(pir a,pir b) { vl v={a.first,a.second,b.first,b.second}; sort(all(v)); return {v[0],v[1]}; } vvl binup(vvp& v,ll root,vvl& data,vl& ht,vl& lvl) { ll i,j,n=v.size()-1; ll m=first1(n)+1; vvl bin(m,vl(n+1)); data.resize(m,vl(n+1,inf)); vl vt(n+1); function<void(ll)> dfs=[&](ll nd) { vt[nd]=1; for(auto g:v[nd]) { if(vt[g.first]) continue; bin[0][g.first]=nd; dfs(g.first); } }; dfs(root); fr(j,1,m-1) fr(i,1,n) bin[j][i]=bin[j-1][bin[j-1][i]]; vp info(n+1,{inf,inf}); fr(i,1,n) { info[i]={ht[i]-lvl[i],inf}; for(auto g:v[i]) if(bin[0][g.first]==i) info[i]=merge(info[i],{ht[g.first]-lvl[g.first]+2*g.second,inf}); } fr(i,1,n) { data[0][i]=info[bin[0][i]].first; ll x=0; for(auto g:v[bin[0][i]]) if(g.first==i) x=g.second; if(info[bin[0][i]].first==ht[i]-lvl[i]+2*x) data[0][i]=info[bin[0][i]].second; } fr(j,1,m-1) fr(i,1,n) data[j][i]=min(data[j-1][i],data[j-1][bin[j-1][i]]); return bin; } ll lca(vvl& bin,vl& lvl,ll a,ll b) { ll i,lc,m=bin.size(); if(lvl[a]<lvl[b]) swap(a,b); fn(i,m) if(lvl[a]-(1ll<<i)>=lvl[b]) a=bin[i][a]; if(a==b) return a; fn(i,m) if(bin[i][a]!=bin[i][b]) a=bin[i][a],b=bin[i][b]; return bin[0][a]; } void solve(ll tc) { ll n,m,k=0,j=0,i=0,x=0,y=0,z=0,p=0,q=0,l=0,sum=0,temp=1,flag=0,a=0,b=0,c=0,d=1,r=0,mn=inf,mx=-inf,_,__,mid; string s1,s2,s3,s;char ch; cin>>n>>m>>q>>p; vvp v(n+1); vp edge(n); f(i,n-1) { cin>>x>>y>>d; edge[i+1]={x,y}; v[x].pb({y,d}); v[y].pb({x,d}); } vl vt(n+1),ht(n+1,inf),lvl(n+1); f(i,m) { cin>>x;ht[x]=0; } vl tin(n+1),tout(n+1);c=0; function<void(ll)>dfs=[&](ll nd) { vt[nd]=1; tin[nd]=++c; for(auto g:v[nd]) { if(vt[g.first]) continue; lvl[g.first]=lvl[nd]+g.second; dfs(g.first); ht[nd]=min(ht[nd],ht[g.first]+g.second); } tout[nd]=c; }; dfs(p); ht[0]=inf; vvl data; vvl bin=binup(v,p,data,ht,lvl); vl lvvl=level(v,p); while(q--) { cin>>p>>x;c=x; x=edge[p].first; y=edge[p].second; if(tin[y]>tin[x]) swap(x,y); if(!(tin[c]>=tin[x]&&tin[c]<=tout[x])) { cout<<"escaped"<<endl; continue; } k=lvvl[c]-lvvl[x];x=c; mn=ht[x]-lvl[x]; s=bs(20,k); reverse(all(s)); f(i,20) { if(s[i]=='1') { mn=min(mn,data[i][x]); x=bin[i][x]; } } if(mn+lvl[c]==inf) cout<<"oo"<<endl; else cout<<mn+lvl[c]<<endl; } } //Use variables correctly //Check for boundary conditions //Write the step statement in while loops int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL); ll t=1; // cin>>t; while(t--) { solve(t); cout<<endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...