이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 4;
const int LG = 20;
int par[N][LG];
int a[N], b[N], d[N], lz[N];
array<int, 2> c[N];
array<int, 2> up[N];
vector<array<int, 3>> adj[N];
int n, ans;
void dfs(int u, int v, int depth) {
d[u] = depth;
par[u][0] = v;
for (int i = 0; i < (int)adj[u].size(); i++) {
int s = adj[u][i][0];
int c1 = adj[u][i][1], c2 = adj[u][i][2];
if (s != v) {
array<int, 2> nx;
nx[0] = c1;
nx[1] = c2;
up[s] = nx;
dfs(s, u, depth + 1);
}
}
}
void dfs2(int u, int v) {
for (int i = 0; i < (int)adj[u].size(); i++) {
int s = adj[u][i][0];
if (s != v) {
dfs2(s, u);
lz[u] += lz[s];
}
}
}
int lca(int u, int v) {
if (d[u] < d[v]) {
swap(u, v);
}
int df = d[u] - d[v];
for (int i = LG - 1; i >= 0; i--) {
if (df >= (1 << i)) {
df -= (1 << i);
u = par[u][i];
}
}
if (u == v) {
return u;
}
for (int i = LG - 1; i >= 0; i--) {
if (par[u][i] != par[v][i]) {
u = par[u][i];
v = par[v][i];
}
}
return par[u][0];
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n - 1; i++) {
cin >> a[i] >> b[i] >> c[i][0] >> c[i][1];
array<int, 3> nz;
nz[0] = b[i];
nz[1] = c[i][0];
nz[2] = c[i][1];
adj[a[i]].push_back(nz);
array<int, 3> nx;
nx[0] = a[i];
nx[1] = c[i][0];
nx[2] = c[i][1];
adj[b[i]].push_back(nx);
}
dfs(1, -1, 0);
for (int j = 1; j < LG; j++) {
for (int i = 1; i <= n; i++) {
if (par[i][j - 1] == -1) {
par[i][j] = -1;
continue;
}
par[i][j] = par[par[i][j - 1]][j - 1];
}
}
for (int i = 2; i <= n; i++) {
++lz[i - 1];
++lz[i];
lz[lca(i, i - 1)] -= 2;
}
dfs2(1, -1);
ans = 0;
for (int i = 1; i <= n; i++) {
ans += min(lz[i] * up[i][0], up[i][1]);
}
cout << ans;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |