# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
105113 | Just_Solve_The_Problem | Designated Cities (JOI19_designated_cities) | C++11 | 534 ms | 45940 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define fr first
#define sc second
#define ll long long
using namespace std;
const int N = (int)2e5 + 7;
vector<pair<int, int>> gr[N];
int n;
ll ans[N];
ll h[N];
pair < ll, int > dp[N];
int tin[N], tout[N], used[N], par[N];
int tiktak;
void precalc(int v, int pr) {
tin[v] = ++tiktak;
par[v] = pr;
for (auto tto : gr[v]) {
int to = tto.fr;
int w = tto.sc;
if (to == pr) {
continue;
}
h[v] += w;
precalc(to, v);
h[v] += h[to];
}
tout[v] = tiktak;
}
pair < int, int > ans2;
void dfs1(int v, int pr, ll H = 0) {
ll res = 0;
for (auto tto : gr[v]) {
int to = tto.fr;
int w = tto.sc;
if (to == pr) {
H += w;
}
}
ans[1] = min(ans[1], H + h[v]);
dp[v] = {h[v], v};
ll mx = 1e18;
int ind = -1;
for (auto tto : gr[v]) {
int to = tto.fr;
int w = tto.sc;
if (to == pr) continue;
dfs1(to, v, H + h[v] - h[to] - w);
if (mx != 1e18) {
if (mx + dp[to].fr + h[v] - w - h[to] + H < ans[2]) {
// cout << mx + dp[to].fr + h[v] - w - h[to] + H << ' ' << dp[ind].sc << ' ' << dp[to].sc << '\n';
ans[2] = mx + dp[to].fr + h[v] - w - h[to] + H;
ans2 = {dp[ind].sc, dp[to].sc};
}
}
if (dp[to].fr - w - h[to] < mx) {
mx = dp[to].fr - w - h[to];
ind = to;
}
if (dp[to].fr + H + h[v] - h[to] - w < ans[2]) {
ans[2] = dp[to].fr + H + h[v] - h[to] - w;
ans2 = {v, dp[to].sc};
}
if (make_pair(dp[to].fr + h[v] - w - h[to], dp[to].sc) < dp[v]) {
dp[v] = make_pair(dp[to].fr + h[v] - w - h[to], dp[to].sc);
}
}
}
bool upper(int a, int b) {
return tin[a] <= tin[b] && tout[a] >= tout[b];
}
main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
ans[i] = 1e18;
dp[i] = {1e18, 0};
}
for (int i = 1; i < n; i++) {
int a, b, c, d;
scanf("%d %d %d %d", &a, &b, &c, &d);
gr[a].push_back({b, c});
gr[b].push_back({a, d});
}
precalc(1, 1);
dfs1(1, 1);
used[ans2.fr] = 1;
while (!upper(ans2.fr, ans2.sc)) {
ans2.fr = par[ans2.fr];
used[ans2.fr] = 1;
}
used[ans2.sc] = 1;
while (!upper(ans2.sc, ans2.fr)) {
ans2.sc = par[ans2.sc];
used[ans2.sc] = 1;
}
int q;
scanf("%d", &q);
while (q--) {
int x;
scanf("%d", &x);
printf("%lld\n", ans[x]);
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |