Submission #1275902

#TimeUsernameProblemLanguageResultExecution timeMemory
1275902tu2108Valley (BOI19_valley)C++20
100 / 100
326 ms28252 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define faster ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define fi first
#define se second
#define pb push_back
#define getbit(x , i) ((x >> i) & 1)
typedef pair<int , int> pii;

const int inf = 1e18;
const int mod = 1e9 + 7;
const int maxn = 1e5;

int n , s , root , q , tin = 0;
vector<pii> adj[maxn + 5];
vector<int> qr1[maxn + 5];
int d[maxn + 5] , in[maxn + 5] , out[maxn + 5] , st[4 * maxn + 5] , lazy[4 * maxn + 5] , ans[maxn + 5];
pii qr[maxn + 5];
bool check[maxn + 5];

struct edge{
    int u , v , w;
};
edge e[maxn + 5];

void dfs(int u){
    in[u] = ++tin;

    for(auto v : adj[u]){
        if(in[v.fi]) continue;
        d[v.fi] = d[u] + v.se;

        dfs(v.fi);
    }
    out[u] = tin;
}

void add(int id , int val){
    st[id] += val;
    lazy[id] += val;
}

void down(int id){
    add(id * 2 , lazy[id]);
    add(id * 2 + 1 , lazy[id]);
    lazy[id] = 0;
}

void update(int id , int l , int r , int u , int v , int val){
    if(v < l || r < u) return;
    if(u <= l && r <= v){
        add(id , val);
        return;
    }
    if(lazy[id] != 0) down(id);

    int mid = (l + r) >> 1;
    update(id * 2 , l , mid , u , v , val);
    update(id * 2 + 1 , mid + 1 , r , u , v , val);

    st[id] = min(st[id * 2] , st[id * 2 + 1]);
}

int get(int id , int l , int r , int u , int v){
    if(v < l || r < u) return inf;
    if(u <= l && r <= v) return st[id];
    if(lazy[id] != 0) down(id);

    int mid = (l + r) >> 1;
    int getl = get(id * 2 , l , mid , u , v);
    int getr = get(id * 2 + 1 , mid + 1 , r , u , v);
    return min(getl , getr);
}

void dfs1(int u){
    for(auto i : qr1[u]){
        int id = qr[i].fi;
        ans[i] = get(1 , 1 , n , in[e[id].v] , out[e[id].v]);
    }

    for(auto v : adj[u]){
        if(d[v.fi] < d[u]) continue;

        update(1 , 1 , n , 1 , in[v.fi] - 1 , v.se);
        update(1 , 1 , n , out[v.fi] + 1 , n , v.se);
        update(1 , 1 , n , in[v.fi] , out[v.fi] , -v.se);

        dfs1(v.fi);

        update(1 , 1 , n , 1 , in[v.fi] - 1 , -v.se);
        update(1 , 1 , n , out[v.fi] + 1 , n , -v.se);
        update(1 , 1 , n , in[v.fi] , out[v.fi] , v.se);
    }
}

main()
{
    faster
    cin >> n >> s >> q >> root;
    for(int i = 1 ; i < n ; ++i){
        cin >> e[i].u >> e[i].v >> e[i].w;
        adj[e[i].u].pb({e[i].v , e[i].w});
        adj[e[i].v].pb({e[i].u , e[i].w});
    }
    for(int i = 1 ; i <= s ; ++i){
        int u;
        cin >> u;
        check[u] = 1;
    }

    dfs(root);

    for(int i = 1 ; i < n ; ++i){
        if(d[e[i].u] > d[e[i].v]) swap(e[i].u , e[i].v);
    }

    for(int i = 1 ; i <= n ; ++i){
        int val = d[i];
        if(!check[i]) val = inf;
        update(1 , 1 , n , in[i] , in[i] , val);
    }

    for(int i = 1 ; i <= q ; ++i){
        cin >> qr[i].fi >> qr[i].se;
        int id = qr[i].fi , x = qr[i].se;

        if(in[e[id].v] <= in[x] && in[x] <= out[e[id].v]) qr1[x].pb(i);
        else ans[i] = -1;
    }

    dfs1(root);

    for(int i = 1 ; i <= q ; ++i){
        if(ans[i] == -1) cout << "escaped" << '\n';
        else if(ans[i] >= 1e17) cout << "oo" << '\n';
        else cout << ans[i] << '\n';
    }
}

Compilation message (stderr)

valley.cpp:97:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   97 | main()
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...