Submission #720146

#TimeUsernameProblemLanguageResultExecution timeMemory
720146Ahmed57Valley (BOI19_valley)C++14
100 / 100
482 ms57360 KiB
#include <bits/stdc++.h>

using namespace std;
#define int long long
long long dis[100001];
bool ch[100001];
long long an[100001];
vector<pair<int,long long>> adj[100001];
int P[100001][17];
pair<long long,long long> V[100001][17];int dep[100001];
void dfs(int i,int pr){
    P[i][0] = pr;
    dep[i] = dep[pr]+1;
    V[i][0] = {an[i]-dis[i],dis[i]};
    for(int j = 1;j<17;j++){
        P[i][j] = P[P[i][j-1]][j-1];
        V[i][j] = min(V[i][j-1],V[P[i][j-1]][j-1]);
    }
    for(auto j:adj[i]){
        if(j.first==pr)continue;
        dis[j.first] = dis[i]+j.second;
        dfs(j.first,i);
    }
}
long long calc(int i,int pr){
    long long ans = (ch[i]?0:1e18);
    for(auto j:adj[i]){
        if(j.first==pr)continue;
        ans = min(ans,calc(j.first,i)+j.second);
    }
    return an[i] = ans;
}
bool can(int no1,int no2){
    if(dep[no1]<dep[no2])return 0;
    for(int j = 16;j>=0;j--){
        if(dep[no1]-dep[no2]>=(1<<j)){
            no1=P[no1][j];
        }
    }
    return no1==no2;
}
pair<long long,long long> lca(long long no1,long long no2){
    pair<long long,long long> ans = {1e18,0};
    for(int j = 16;j>=0;j--){
        if(dep[no1]-dep[no2]+1>=(1<<j)){
            ans = min(ans,V[no1][j]);
            no1=P[no1][j];
        }
    }
    return ans;
}
signed main(){
    an[0]= 1e18;
    int n,s,q,e;
    cin>>n>>s>>q>>e;
    vector<pair<long long,long long>> v;
    for(int i = 0;i<n-1;i++){
        long long a,b,c;cin>>a>>b>>c;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
        v.push_back({a,b});
    }
    for(int i = 0;i<s;i++){
        int x;cin>>x;ch[x] = 1;
    }
    calc(e,1);
    dfs(e,1);
    for(int i = 0;i<v.size();i++){
        if(dep[v[i].first]>dep[v[i].second])swap(v[i].first,v[i].second);
    }
    while(q--){
        int blo,nod;cin>>blo>>nod;
        blo = v[blo-1].second;
        if(can(nod,blo)){
            pair<long long,long long> val = lca(nod,blo);
            if(val.first>=1e16){
                cout<<"oo"<<endl;
            }else{
                cout<<val.first+val.second+(dis[nod]-val.second)<<endl;
            }
        }else cout<<"escaped"<<endl;
    }
}

Compilation message (stderr)

valley.cpp: In function 'int main()':
valley.cpp:68:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |     for(int i = 0;i<v.size();i++){
      |                   ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...