답안 #766616

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
766616 2023-06-26T01:54:32 Z amogususus Valley (BOI19_valley) C++17
0 / 100
124 ms 45284 KB
#pragma GCC optimize("Ofast,unroll-loops,inline")
#pragma GCC target("avx,avx2,bmi,popcnt")
#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define pb push_back
#define prec fixed<<setprecision
#define endl '\n'
#define all(x) x.begin(),x.end()
#define pll pair<ll,ll>
#define open(name) if(fopen(name".inp", "r")){freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout);}
#define fout(name) freopen(name".out", "w", stdout);
using namespace std;
const int maxN=1e5+69;
const int mod =998244353;
ll n,k,q,h[maxN],d[maxN],dp[maxN],num[maxN],out[maxN],up[20][maxN],mn[20][maxN];
bitset<maxN> spec;
vector<pll> adj[maxN];
ll Time=0;
ll E;
void dfs(ll u,ll p=E){
    num[u]=++Time;
    for(auto[v,w]:adj[u])if(v!=p)d[v]=d[u]+w,h[v]=h[u]+1,dfs(v,u);
    dp[u]=1e18;
    if(spec[u])dp[u]=d[u];
    else for(auto[v,w]:adj[u])if(v!=p)dp[u]=min(dp[u],dp[v]);

    up[0][u]=p;
    if(dp[u]==1e18)mn[0][u]=1e18;
    else mn[0][u]=dp[u]-2*d[u];
    for(int i=1;i<20;i++)
        up[i][u]=up[i-1][up[i-1][u]],
        mn[i][u]=min(mn[i-1][u],mn[i-1][up[i-1][u]]);

    out[u]=Time;
}
bool is_ancestor(int u, int v) {return num[u] <= num[v] && out[v] <= out[u];}
void Enter(){
    cin>>n>>k>>q>>E;
    vector<pll> edg;edg.pb({0,0});
    ll u,v,w;
    for(int i=1;i<n;i++){
        cin>>u>>v>>w;
        adj[u].pb({v,w});
        adj[v].pb({u,w});
        edg.pb({u,v});
    }
    for(int i=1;i<=k;i++)cin>>u,spec[u]=1;
    dfs(E);
    for(auto&[u,v]:edg)if(h[u]<h[v])swap(u,v);
    while(q--){
        ll id;
        cin>>id>>u;
        v=edg[id].first;
        if(!is_ancestor(v,u))cout<<"escaped"<<endl;
        else {
            ll m=h[u]-h[v],r=1e18;
            for(int i=19;~i;i--)
                if(m>>i&1)r=min(r,mn[i][u]),u=up[i][u];
            r=min(r,mn[0][u]);
            if(r==1e18)cout<<"oo"<<endl;
            else cout<<r+d[u]+m+h[v]<<endl;
        }
    }
}
//amogus
signed main(){
    //open("GARDEN");
    cin.tie(nullptr);ios_base::sync_with_stdio(NULL);
    //ll t=1;cin>>t;while(t--)
    Enter();
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 3028 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 3028 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 124 ms 45284 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 3028 KB Output isn't correct
2 Halted 0 ms 0 KB -