제출 #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...