Submission #134900

#TimeUsernameProblemLanguageResultExecution timeMemory
134900Bodo171Valley (BOI19_valley)C++14
100 / 100
599 ms43640 KiB
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=100005;
const long long inf=1LL*1e15;
vector< pair<int,int> > v[nmax];
vector<int> label[nmax];
long long lev[nmax],closest[nmax];
long long mn[20][nmax];
long long ans;
int tt[20][nmax];
int l[nmax],r[nmax],dpth[nmax],actual[nmax];
int nr,n,spec,q,root,i,x,y,z,j,blocat,nod,cat;
void dfs(int x)
{
    int nod=0;
    l[x]=++nr;
    for(int i=0;i<v[x].size();i++)
        if(!l[v[x][i].first])
    {
        nod=v[x][i].first;
        tt[0][nod]=x;dpth[nod]=dpth[x]+1;
        actual[label[x][i]]=nod;
        lev[nod]=1LL*lev[x]+v[x][i].second;
        dfs(nod);
        closest[x]=min(closest[x],closest[nod]+v[x][i].second);
    }
    r[x]=nr;
}
int main()
{
    //freopen("data.in","r",stdin);
    ios_base::sync_with_stdio(false);
    cin>>n>>spec>>q>>root;
    for(i=1;i<=n-1;i++)
    {
        cin>>x>>y>>z;
        v[x].push_back({y,z});
        v[y].push_back({x,z});
        label[x].push_back(i);
        label[y].push_back(i);
    }
    for(i=1;i<=n;i++)
        closest[i]=inf;
    for(i=1;i<=spec;i++)
    {
        cin>>x;
        closest[x]=0;
    }
    dfs(root);
    for(i=1;i<=n;i++)
        mn[0][i]=closest[i]-lev[i];
    for(i=1;i<=16;i++)
        for(j=1;j<=n;j++)
    {
        tt[i][j]=tt[i-1][tt[i-1][j]];
        mn[i][j]=min(mn[i-1][j],mn[i-1][tt[i-1][j]]);
    }
    for(i=1;i<=q;i++)
    {
        cin>>blocat>>x;
        y=actual[blocat];
        if(l[y]<=l[x]&&l[x]<=r[y])
        {
            ans=inf;cat=dpth[x]-dpth[y]+1;nod=x;
            for(int p=16;p>=0;p--)
              if(((1<<p)&cat))
            {
                ans=min(ans,mn[p][nod]+lev[x]);
                nod=tt[p][nod];
            }
            if(ans==inf) cout<<"oo\n";
            else cout<<ans<<'\n';
        }
        else cout<<"escaped\n";
    }
    return 0;
}

Compilation message (stderr)

valley.cpp: In function 'void dfs(int)':
valley.cpp:19:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<v[x].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...