제출 #549169

#제출 시각아이디문제언어결과실행 시간메모리
549169krit3379Valley (BOI19_valley)C++17
100 / 100
200 ms43832 KiB
#include<bits/stdc++.h>
using namespace std;
#define N 100005

int tin[N],tout[N],depp[N],bp[20][N],t;
long long dp[N],dep[N],mi[20][N],ans;
pair<int,int> edge[N];
vector<pair<int,long long>> g[N];
// dp[i] lowest shop in i subtree

void dfs(int s,int f){
    tin[s]=++t;
    if(dp[s]==-1)dp[s]=dep[s];
    for(auto [x,w]:g[s]){
        if(x==f)continue;
        dep[x]=dep[s]+w;
        dfs(x,s);
        dp[s]=min(dp[s],dp[x]);
    }
    tout[s]=t;
}

void dfs2(int s,int f){
    depp[s]=depp[f]+1;
    bp[0][s]=f;
    mi[0][s]=dp[f]-2*dep[f];
    for(auto [x,w]:g[s]){
        if(x==f)continue;
        dfs2(x,s);
    }
}

int main(){
    int n,s,q,e,a,b,i,j,k,idx,r;
    long long w;
    scanf("%d %d %d %d",&n,&s,&q,&e);
    for(i=1;i<n;i++){
        scanf("%d %d %lld",&a,&b,&w);
        g[a].push_back({b,w});
        g[b].push_back({a,w});
        edge[i]={a,b};
        dp[i]=1e18;
    }
    dp[n]=1e18;
    for(i=1;i<=s;i++){
        scanf("%d",&k);
        dp[k]=-1;
    }
    dfs(e,0);
    dfs2(e,0);
    for(i=1;i<20;i++)for(j=1;j<=n;j++)bp[i][j]=bp[i-1][bp[i-1][j]],mi[i][j]=min(mi[i-1][j],mi[i-1][bp[i-1][j]]);
    while(q--){
        scanf("%d %d",&idx,&r);
        auto [a,b]=edge[idx];
        a=(depp[a]>depp[b])?a:b;
        if(tin[a]<=tin[r]&&tin[r]<=tout[a]){
            int dif=depp[r]-depp[a],temp=r;
            ans=dp[r]-dep[r];
            for(i=0;i<20;i++)if(dif&(1<<i))ans=min(ans,dep[r]+mi[i][temp]),temp=bp[i][temp];
            if(ans>1e16)printf("oo\n");
            else printf("%lld\n",ans);
        }
        else printf("escaped\n");
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

valley.cpp: In function 'int main()':
valley.cpp:36:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   36 |     scanf("%d %d %d %d",&n,&s,&q,&e);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:38:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 |         scanf("%d %d %lld",&a,&b,&w);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:46:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   46 |         scanf("%d",&k);
      |         ~~~~~^~~~~~~~~
valley.cpp:53:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |         scanf("%d %d",&idx,&r);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...