Submission #764976

#TimeUsernameProblemLanguageResultExecution timeMemory
764976vjudge1Roadside Advertisements (NOI17_roadsideadverts)C++17
100 / 100
45 ms11764 KiB
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <bitset>
#include <cmath>
#include <queue>
#include <map>
#include <set>

// Akhmet Issa

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define ent "\n"

const int maxn = 5e4 + 100;
const ll INF = (ll)2e18;
const int inf = (ll)2e9;
const int maxl = 20;
const int MOD = 1e9 + 7;

int n, t, q;
vector<pii> g[maxn];
int p[maxl][maxn];
int sum[maxn];
int dep[maxn];
int tin[maxn];
int tout[maxn];

void dfs(int v){
    tin[v] = ++t;
    for(int k = 1; k < maxl; k++){
        p[k][v] = p[k-1][p[k-1][v]];
    }
    for(auto [to, w]: g[v]){
        if(to == p[0][v]) continue;
        p[0][to] = v;
        sum[to] = sum[v] + w;
        dep[to] = dep[v] + 1;
        dfs(to);
    }
    tout[v] = t;
}

bool ok(int a, int b){
    return tin[a] <= tin[b] && tout[b] <= tout[a];
}

int get(int a, int b){
    if(ok(a, b)) return a;
    if(ok(b, a)) return b;
    for(int k = maxl - 1; k >= 0; k--){
        if(p[k][a] && !ok(p[k][a], b)) a = p[k][a];
    }
    return p[0][a];
}

void test(){
    cin >> n;
    for(int i = 1; i < n; i++){
        int a, b, c;
        cin >> a >> b >> c;
        a++; b++;
        g[a].push_back({b, c});
        g[b].push_back({a, c});
    }
    dfs(1);
    cin >> q;
    vector<pair<int,int>>vec;
    for(int t = 1; t <= q; t++){
        vec.clear();
        for(int i = 0; i < 5; i++){
            int x;
            cin >> x;
            x++;
            vec.emplace_back(tin[x], x);
        }
        sort(vec.begin(), vec.end());
        ll ans = 0;
        for (int i = 0 ; i < 5 ; ++ i) {
            int x = vec[i].second;
            int y = vec[i == 4 ? 0 : i + 1].second;
            int z = get(x, y);
            ans += sum[x] + sum[y] - 2 * sum[z];
        }
        cout << ans / 2 << ent;
    }
}

int main(){
    // freopen("cows.in", "r", stdin);
    // freopen("cows.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int t = 1;
    while(t--) test();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...