제출 #530520

#제출 시각아이디문제언어결과실행 시간메모리
530520Servus2022Putovanje (COCI20_putovanje)C++14
110 / 110
119 ms26332 KiB
#include <bits/stdc++.h> using namespace std; typedef long long LL; constexpr int NMAX = 2e5 + 5; struct Edge { int X, Y; int Cost_1, Cost_2; }; int N; vector <int> G[NMAX]; Edge E[NMAX]; int fr[NMAX]; int Level[NMAX]; int Dad[18][NMAX]; int Add[NMAX]; void Read () { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> N; for (int i = 1; i < N; ++ i ) { cin >> E[i].X >> E[i].Y >> E[i].Cost_1 >> E[i].Cost_2; G[E[i].X].push_back(i); G[E[i].Y].push_back(i); } } void Dfs (int Node, int dad = 0) { Dad[0][Node] = dad; Level[Node] = Level[dad] + 1; for (int i = 1; i < 18; ++ i ) Dad[i][Node] = Dad[i-1][Dad[i-1][Node]]; for (auto it : G[Node]) { int to = (E[it].X == Node ? E[it].Y : E[it].X); if (to == dad) continue; Dfs(to, Node); } } int Parent (int Node, int who) { for (int i = 0; i < 18; ++ i ) if ((who&(1<<i))) Node = Dad[i][Node]; return Node; } int LCA (int x, int y) { if (Level[x] > Level[y]) swap(x, y); y = Parent(y, Level[y] - Level[x]); if (x == y) return x; for (int i = 17; i >= 0; -- i ) { if (Dad[i][x] != Dad[i][y]) { x = Dad[i][x]; y = Dad[i][y]; } } return Dad[0][x]; } void Precalculare () { Dfs(1); for (int i = 1; i < N; ++ i ) { int z = LCA(i, i+1); Add[i]++; Add[i+1]++; Add[z] -= 2; } } void Collect (int Node, int dad = -1, int ind = 0) { for (auto it : G[Node]) { int to = (E[it].X == Node ? E[it].Y : E[it].X); if (to == dad) continue; Collect(to, Node, it); Add[Node] += Add[to]; } fr[ind] = Add[Node]; } void Solve () { Collect(1); LL ans = 0; for (int i = 1; i < N; ++ i ) ans += min(1LL * E[i].Cost_2, 1LL * fr[i] * E[i].Cost_1); cout << ans << '\n'; } int main() { Read(); Precalculare(); Solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...