Submission #987860

#TimeUsernameProblemLanguageResultExecution timeMemory
987860AcanikolicRoadside Advertisements (NOI17_roadsideadverts)C++14
100 / 100
51 ms15808 KiB
#include <bits/stdc++.h>

#define pb push_back

#define S second

#define F first

const int N = 1e5 + 10;

const int inf = 2e9;

const int lg = 17;

using namespace std;

vector<pair<int,int>>g[N];
int up[N][lg],in[N],out[N],timer = 0,dist[N];

void dfs(int x,int par) {
    in[x] = ++timer;
    if(par != -1) up[x][0] = par;
    if(par != -1) for(int j = 1; j < lg; j++) up[x][j] = up[up[x][j - 1]][j - 1];
    for(auto X : g[x]) {
        if(X.F == par) continue;
        dist[X.F] = dist[x] + X.S;
        dfs(X.F,x);
    }
    out[x] = timer;
}

bool intree(int u,int v) {
    return (in[u] <= in[v] && out[u] >= out[v]);
}

int lca(int u,int v) {
    if(intree(u,v)) return u;
    if(intree(v,u)) return v;
    for(int j = lg - 1; j >= 0; j--) {
        if(up[u][j] > 0 && !intree(up[u][j],v)) u = up[u][j];
    }
    return up[u][0];
}

bool cmp(int A,int B) {
    return (in[A] <= in[B]);
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;
    for(int i = 1; i < n; i++) {
        int u,v,w;
        cin >> u >> v >> w;
        g[u].pb({v,w});
        g[v].pb({u,w});
    }
    dfs(0,-1);
    int q;
    cin >> q;
    while(q--) {
        vector<int>vec;
        for(int i = 0; i < 5; i++) {
            int X;
            cin >> X;
            vec.pb(X);
        }
        sort(vec.begin(),vec.end(),cmp);
        vec.pb(vec[0]);
        int res = 0;
        for(int i = 0; i < 5; i++) {
            res += dist[vec[i]];
            res -= dist[lca(vec[i],vec[i + 1])];
        }
        cout << res << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...