제출 #523391

#제출 시각아이디문제언어결과실행 시간메모리
523391NachoLibreDesignated Cities (JOI19_designated_cities)C++17
100 / 100
1929 ms123796 KiB
#include <bits/stdc++.h> #define ll long long #define ld long double #define sz(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() using namespace std; const int N = 200005; int n, p5[N]; vector<int> iv[N], v[N]; vector<array<ll, 2> > se[N][2], m5; map<array<int, 2>, int> e; array<ll, 2> s[N], spt[N], p1; array<ll, 3> p2; ll t0, fp[N], is5[N]; vector<ll> u5, u5c; bool t5[N]; array<ll, 2> operator+(array<ll, 2> x, int y) { x[0] += y; return x; } void dfs_0(int x = 1, int y = 0) { for(int z : iv[x]) { if(z == y) continue; v[x].push_back(z); dfs_0(z, x); } } void dfs_1(int x = 1) { s[x] = {0, x}; se[x][0].resize(sz(v[x])); se[x][1].resize(sz(v[x])); for(int z : v[x]) { dfs_1(z); s[x] = max(s[x], s[z] + e[{x, z}]); } if(!sz(v[x])) return; se[x][0][0] = s[v[x][0]] + e[{x, v[x][0]}]; for(int i = 1; i < sz(v[x]); ++i) { se[x][0][i] = max(se[x][0][i - 1], s[v[x][i]] + e[{x, v[x][i]}]); } se[x][1].back() = s[v[x].back()] + e[{x, v[x].back()}]; for(int i = sz(v[x]) - 2; i >= 0; --i) { se[x][1][i] = max(se[x][1][i + 1], s[v[x][i]] + e[{x, v[x][i]}]); } } void dfs_2(int x = 1) { for(int i = 0; i < sz(v[x]); ++i) { int z = v[x][i]; array<ll, 2> l = {0, 0}, r = {0, 0}; if(i > 0) l = se[x][0][i - 1]; if(i < sz(v[x]) - 1) r = se[x][1][i + 1]; spt[z] = max(max(l, r), spt[x]) + e[{z, x}]; dfs_2(z); } } ll dfs_3(int x = 1) { ll y = 0; for(int z : v[x]) { y += dfs_3(z) + e[{z, x}]; } return y; } void dfs_4(ll y, int x = 1) { p1 = max(p1, array<ll, 2>{y, x}); array<ll, 2> t2 = max(s[x], spt[x]); array<ll, 3> t3 = {t2[0] + y, t2[1], x}; p2 = max(p2, t3); for(int z : v[x]) { dfs_4(y - e[{z, x}] + e[{x, z}], z); } } void dfs_5(int x = p2[1], int y = 0) { p5[x] = y; for(int z : iv[x]) { if(z == y) continue; dfs_5(z, x); } } void dfs_6(int x = p2[1], int y = 0) { if(!t5[x]) { is5[x] = is5[y] + e[{y, x}]; } for(int z : iv[x]) { if(z == y) continue; dfs_6(z, x); } } int main() { ios::sync_with_stdio(0); cin.tie(0); #ifdef x freopen("x.txt", "r", stdin); #endif cin >> n; for(int i = 1; i < n; ++i) { int x, y, c, d; cin >> x >> y >> c >> d; iv[x].push_back(y); iv[y].push_back(x); e[{x, y}] = c; e[{y, x}] = d; t0 += c + d; } dfs_0(); dfs_1(); spt[1] = {0, 1}; dfs_2(); dfs_4(dfs_3()); dfs_5(); int x = p2[2]; while(x) { t5[x] = 1; x = p5[x]; } dfs_6(); for(int i = 1; i <= n; ++i) { m5.push_back(array<ll, 2>{is5[i], i}); } sort(all(m5)); reverse(all(m5)); u5 = vector<ll>(n + 1); for(auto x : m5) { int y = x[1]; int iy = y; while(!t5[y]) { u5[iy] += e[{p5[y], y}]; t5[y] = 1; y = p5[y]; } } u5c = u5; sort(1 + all(u5c)); fp[1] = t0 - p1[0]; fp[2] = t0 - p2[0]; for(int i = n; i >= 3; --i) { fp[3 + n - i] = fp[2 + n - i] - u5c[i]; } int q; cin >> q; for(int i = 0; i < q; ++i) { int x; cin >> x; cout << fp[x] << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...