제출 #1283227

#제출 시각아이디문제언어결과실행 시간메모리
1283227G_thang_dizz_lenhiRoadside Advertisements (NOI17_roadsideadverts)C++20
100 / 100
41 ms10232 KiB
#include<bits/stdc++.h>
typedef int ii;
typedef long long ll;

using namespace std;

const string name = "";
const ii MOD = 1e9 + 7;
const ii N = 5e4 + 10;

ii n, q, a[N * 2];
vector<pair<ii, ii>> e[N];

void INP(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    if (fopen((name + ".inp").c_str(),"r")){
        freopen((name + ".inp").c_str(),"r",stdin);
        freopen((name + ".out").c_str(),"w",stdout);
    }
    cin >> n;
    ii u, v, w;
    for (ii i = 1;i < n;i++){
        cin >> u >> v >> w;
        u++;v++;
        e[u].push_back(make_pair(v, w));
        e[v].push_back(make_pair(u, w));
    }
}

ii in[N], out[N], sum[N], cntdfs;
ii par[17][N];
stack<ii> st;

void dfs(ii u = 1, ii p = 0){
    in[u] = ++cntdfs;
    par[0][u] = p;
    for (auto x : e[u]){
        if (x.first != p){
            sum[x.first] = sum[u] + x.second;
            dfs(x.first, u);
        }
    }
    out[u] = ++cntdfs;
}

bool IsPar(ii u, ii v){
    return in[u] <= in[v] && out[v] <= out[u];
}

ii find_par(ii u, ii v){
    if (IsPar(u, v)) return u;
    if (IsPar(v, u)) return v;
    for (ii bit = 16;bit >= 0;bit--){
        if (!IsPar(par[bit][u], v) && par[bit][u] != 0) u = par[bit][u];
    }
    return par[0][u];
}

ii minPath(ii u, ii v){
    ii p = find_par(u, v);
    return sum[u] + sum[v] - 2 * sum[p];
}

bool dfsTimer(int u, int v){
    return in[u] < in[v];
}

void solve_query(){
    ii k = 5;
    for(int i = 1; i <= k; ++i){
        cin >> a[i];
        a[i]++;
    }

    sort(a + 1, a + 1 + k, dfsTimer);

    for(int i = 1; i < k; ++i){
        a[i+k] = find_par(a[i], a[i+1]);
    }

    k = 2 * k - 1;
    sort(a + 1, a + 1 + k, dfsTimer);
    k = unique(a + 1, a + 1 + k) - a - 1;
    ii res = 0, u;


    for (ii i = 1;i <= k;i++){
        while(!st.empty() && !IsPar(st.top(), a[i])) st.pop();
        if (!st.empty()){
            u = st.top();
            res = res + minPath(u, a[i]);
        }
        st.push(a[i]);
    }

    while(!st.empty()) st.pop();

    cout << res << "\n";
}


int main(){
    INP();
    dfs();
    for (ii bit = 1;bit < 17;bit++){
        for (ii i = 1;i <= n;i++){
            par[bit][i] = par[bit - 1][par[bit - 1][i]];
        }
    }

    cin >> q;
    while(q--){
        solve_query();
    }


    return 0;
}

//NGT 1600-2000 cf
//1/200 hard quests

컴파일 시 표준 에러 (stderr) 메시지

roadsideadverts.cpp: In function 'void INP()':
roadsideadverts.cpp:17:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |         freopen((name + ".inp").c_str(),"r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
roadsideadverts.cpp:18:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |         freopen((name + ".out").c_str(),"w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...