Submission #1100106

#TimeUsernameProblemLanguageResultExecution timeMemory
1100106sofiefuValley (BOI19_valley)C++14
100 / 100
171 ms55892 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vo vector
#define pb push_back
#define se second
#define fi first
#define all(v) v.begin(), v.end()
typedef vector<int> vi;
typedef pair<int, int> pii;

#define rep(i, a, b) for(int i=(a); i<b; i++)
#define pr1(x) cerr << #x << '=' << x << ' ';
//for google contests
#define umap unordered_map
#define uset unordered_set
#define repd(i, a, b) for(int i=(b-1); i >= a; i--)
void _pr(signed x) {cerr << x;}
void _pr(long long x) {cerr << x;}
void _pr(size_t x) {cerr << x;}
void _pr(double x) {cerr << x;}
void _pr(char x) {cerr << '\'' << x << '\'';}
void _pr(const char* x) {cerr << x;}
void _pr(bool x) {cerr << (x ? "true" : "false");}
template<typename T, typename V> void _pr(const pair<T, V> &x);
template<typename T, typename V> void _pr(const pair<T, V> &x) {cerr << "\e[95m" << "[ "; _pr(x.first); cerr << ", "; _pr(x.second); cerr << "\e[95m" << ']';}
template<typename T> void _pr(const T &x) {int F=0; cerr << '{'; for(auto &i: x) cerr << (F++ ? ", " : ""), _pr(i); cerr << "\e[91m" << '}';}
template <typename T, typename... V> void _pr(T t, V... v) {_pr(t); if(sizeof...(v)) cerr << ", "; _pr(v...);}
#define pr(x...) cerr << "\e[91m" << __func__ << ':' << __LINE__ << " [" << #x << "] = ["; _pr(x); cerr << "\e[91m" << ']' << "\033[0m"  << endl;

//go for outline with ;, then details
int const inf = 1e15, mxn = 1e5+4, mxlog=20;
int n, q, s, e, tin[mxn], tout[mxn], dep[mxn], timer, up[mxn][mxlog], shops[mxn];
int dist[mxn]; //from root
vi dp; //stores (distance to closest shop in subtree) + (distance to root, aka e)
int liftdp[mxn][mxlog];
vo<vo<array<int, 3>>> adj;

int dfs(int at, int p, int depth, int d){ // return distance to closest shop
    tin[at] = timer++; dep[at] = depth; dist[at] = d;
    up[at][0] = p;
    rep(k, 1, mxlog){
        up[at][k] = up[up[at][k-1]][k-1];
    }

    int ret = inf;
    for(auto [x, w, edgeind]: adj[at]){
        if(x!=p){
            ret = min(ret, w+dfs(x, at, depth+1, d+w)); 
        }
    }
    tout[at]=timer;
    if(shops[at]) ret = 0;
    
    if(ret==inf) dp[at] = inf;
    else dp[at] = ret - dist[at];
    return ret;
}
void dfsDP(int at, int p){
    liftdp[at][0] = dp[p];
    rep(k, 1, mxlog){
        liftdp[at][k] = min(liftdp[at][k-1], liftdp[up[at][k-1]][k-1]);
    }

    for(auto [x, w, edgeind]: adj[at]){
        if(x!=p) dfsDP(x, at);
    }
}
bool is_ancestor(int u, int v){
    return tin[u]<=tin[v]&&tout[u]>=tout[v];
}
int binary_lift(int v, int d){
    int ret = dp[v];
    rep(i, 0, mxlog){
        if((d>>i) & 1){
            ret = min(ret, liftdp[v][i]);
            v = up[v][i];
        }
    }

    return ret;
}

signed main(){
    cin.tie(0)->sync_with_stdio(0);
    cin>>n>>s>>q>>e; e--;
    adj.resize(n); vo<pii> edgetonode(n); dp.resize(n);
    rep(i, 0, n-1){
        int a, b, w; cin>>a>>b>>w; a--, --b;
        adj[a].pb({b, w, i}), adj[b].pb({a, w, i});
        edgetonode[i] = {a, b};
    }

    rep(i, 0, s){
        int c; cin>>c; c--;
        shops[c] = 1;
    }  

    // preprocess
    dfs(e, e, 0, 0);
    dfsDP(e, e);

    // process queries
    rep(_, 0, q){
        int edge, v; cin>>edge>>v; edge--, v--;
        // check if escapable: push blocked edge to deeper node and check if it is ancestor to village r
        auto [a, b] = edgetonode[edge]; if(dep[a] > dep[b]) swap(a, b);
        if(is_ancestor(b, v)){
            int ret = binary_lift(v, dep[v]-dep[b]); 

            if(ret==inf) cout << "oo\n";
            else cout << ret + dist[v] << "\n";
        }
        else{
            cout << "escaped\n";
        }
    }
}

Compilation message (stderr)

valley.cpp: In function 'long long int dfs(long long int, long long int, long long int, long long int)':
valley.cpp:47:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   47 |     for(auto [x, w, edgeind]: adj[at]){
      |              ^
valley.cpp: In function 'void dfsDP(long long int, long long int)':
valley.cpp:65:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   65 |     for(auto [x, w, edgeind]: adj[at]){
      |              ^
valley.cpp: In function 'int main()':
valley.cpp:107:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  107 |         auto [a, b] = edgetonode[edge]; if(dep[a] > dep[b]) swap(a, b);
      |              ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...