Submission #1168512

#TimeUsernameProblemLanguageResultExecution timeMemory
1168512aycnlElection Campaign (JOI15_election_campaign)C++20
100 / 100
118 ms26956 KiB
#include <bits/stdc++.h> using namespace std; #define ii pair <int, int> #define ff first #define ss second #define bit(i) (1 << (i)) #define fto(i, a, b) for (int i = (a); i <= (b); ++i) #define fdto(i, a, b) for (int i = (a); i >= (b); --i) #define flto(i, a, b) for (int i = (a); (1 << i) <= (b); ++i) #define pb push_back #define pf push_front #define endl "\n" #define oo (int)(1e9 + 7) #define maxN 100005 #define l(s) s.length() #define vi vector <int> #define vii vector <ii> #define fat(x, y) for (auto x : y) #define fit(x, y) for (int x : y) #define fiit(x, y) for (ii x : y) #define EPS 1e-9 #define pi (acos(-1)) #define ll long long int n, m, tme; vi ke[maxN]; vector<pair<int, ii>> path[maxN]; int sta[maxN], fin[maxN], h[maxN]; int par[20][maxN]; ll bt[maxN], dp[maxN]; void ud(int i, ll x) { for (; i <= n; i += (i& -i)) bt[i] += x; } ll qry(int i) { ll res = 0; for (; i; i -= (i & -i)) res += bt[i]; return res; } void pre_dfs(int u) { flto(j, 1, h[u]) par[j][u] = par[j-1][par[j-1][u]]; sta[u] = ++tme; for (int v : ke[u]) if (v != par[0][u]) { par[0][v] = u; h[v] = h[u] + 1; pre_dfs(v); } fin[u] = tme; } int lca(int u, int v) { if (h[u] < h[v]) swap(u, v); fdto(i, 17, 0) if (h[u] - bit(i) >= h[v]) u = par[i][u]; if (u == v) return u; fdto(i, 17, 0) if (par[i][u] != par[i][v]) u = par[i][u], v = par[i][v]; return par[0][u]; } void dfs(int u) { ll sum = 0; for (int v : ke[u]) if (v != par[0][u]) { dfs(v); sum += dp[v]; } dp[u] = sum; for (auto tmp : path[u]) { auto [x, y] = tmp.ss; dp[u] = max(dp[u], qry(sta[x]) + qry(sta[y]) + tmp.ff + sum); } ud(sta[u], sum - dp[u]); ud(fin[u] + 1, dp[u] - sum); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n; fto(i, 1, n-1) { int u, v; cin >> u >> v; ke[u].pb(v); ke[v].pb(u); } pre_dfs(1); cin >> m; fto(i, 1, m) { int u, v, c; cin >> u >> v >> c; path[lca(u, v)].pb({c, {u, v}}); } dfs(1); cout << dp[1] << endl; 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...