Submission #522786

#TimeUsernameProblemLanguageResultExecution timeMemory
522786fadi57Valley (BOI19_valley)C++14
100 / 100
483 ms53636 KiB
#include<bits/stdc++.h>
using namespace std;
const int mx=2e5+9;
typedef long long ll;
const int mod=1000000007;
const long long inf=1e18+10;
const int SQ=450;
int shop[mx];
int tin[mx],tout[mx],depth[mx];

ll cost[mx],mn[20][mx],dp[20][mx],dist[mx];
  int tim;
   int n,s,q,e;
   vector<pair<int,int>>adj[mx];
   int u[mx],v[mx];

   void dfs(int node,int par){
       tin[node]=tim++;

      if(shop[node]==1){
       cost[node]=0;
         }else{
      cost[node]=inf;
}
      for(auto it:adj[node]){

          if(it.first==par){continue;}
          depth[it.first]=depth[node]+1;
          dist[it.first]=dist[node]+it.second;
          dfs(it.first,node);


          cost[node]=min(cost[node],cost[it.first]+it.second);
          }
    tout[node]=tim++;
    }

     void dfs2(int node,int par){
         dp[0][node]=par;
         mn[0][node]=cost[par]-dist[par];
          for(int i=1;i<20;i++){

        dp[i][node]=dp[i-1][dp[i-1][node]];
        mn[i][node]=min(mn[i-1][node],mn[i-1][dp[i-1][node]]);

          }
      for(auto it:adj[node]){

          if(it.first==par){continue;}

          dfs2(it.first,node);
      }

          }

   bool ok(int x,int y){

       if(tin[x]<=tin[y]&&tout[y]<=tout[x]){
        return 1;
          }
       return 0;

     }

   ll calc(int node,int x ){
        ll costt=inf;
        int z=x;
       for(int i=19;i>=0;i--){
        if(depth[dp[i][x]]>=depth[node]){

            costt=min(costt,mn[i][x]);
            x=dp[i][x];
        }
        }
       return costt;

       }

    int main(){

      cin>>n>>s>>q>>e;
 cost[0]=inf;
      for(int i=0;i<n-1;i++){
          int a,b,w;
          cin>>a>>b>>w;
          u[i]=a;
          v[i]=b;
          adj[a].push_back({b,w});
          adj[b].push_back({a,w});
          }
          for(int i=0;i<s;i++){
            int x;
            cin>>x;
            shop[x]=1;
          }
          dfs(e,0);
          dfs2(e,0);

          while(q--){
              int i,r;
              cin>>i>>r;
              i--;
              int node=v[i];
            if(dp[0][u[i]]==v[i]){
                 node=u[i];

            }
                 if(!ok(node,r)){
                      cout<<"escaped";
                 }else{
                      ll ans=calc(node,r);
                      ans=min(ans+dist[r],cost[r]);
                      if(ans>=inf){cout<<"oo";}else{cout<<ans;}
                  //cout<<node<<" "<<ans;
                 }
             cout<<"\n";
          }

     }

Compilation message (stderr)

valley.cpp: In function 'll calc(int, int)':
valley.cpp:67:13: warning: unused variable 'z' [-Wunused-variable]
   67 |         int z=x;
      |             ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...