Submission #1303811

#TimeUsernameProblemLanguageResultExecution timeMemory
1303811jungle15Election Campaign (JOI15_election_campaign)C++17
100 / 100
110 ms27840 KiB
#include <bits/stdc++.h> using namespace std; #define _(x) ((x) & -(x)) #define getbit(x, i) (((x) >> (i)) & 1) template <typename t> void maxi(t &a, t b) { if(a < b) a = b; } const int maxn = 1e5; int n, nq; vector<int> adj[maxn + 2]; vector<tuple<int, int, int>> cands[maxn + 2]; void init(void) { cin >> n; for(int i = 1; i < n; ++i) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } cin >> nq; } const int maxlog = 20; struct Fenwick { int bit[maxn + 2]; Fenwick(void) { memset(bit, 0, sizeof(bit)); } void update(int x, const int val) { for(; x <= n; x += _(x)) bit[x] += val; } void update(const int l, const int r, const int val) { update(l, val); update(r + 1, -val); } int get(int x) { int ans = 0; for(; x; x -= _(x)) ans += bit[x]; return ans; } } bit; int timer, tin[maxn + 2], par[maxn + 2][maxlog], tout[maxn + 2], depth[maxn + 2]; void pre_DFS(const int u = 1) { tin[u] = ++timer; for(const int &v : adj[u]) { if(v == par[u][0]) continue; depth[v] = depth[u] + 1; par[v][0] = u; for(int i = 1; i < maxlog; ++i) par[v][i] = par[par[v][i - 1]][i - 1]; pre_DFS(v); } tout[u] = timer; } int lca(int u, int v) { if(depth[u] > depth[v]) swap(u, v); int diff = depth[v] - depth[u]; for(int i = 0; i < maxlog; ++i) if(getbit(diff, i)) v = par[v][i]; if(u == v) return u; for(int i = maxlog - 1; i > -1; --i) if(par[u][i] != par[v][i]) { u = par[u][i]; v = par[v][i]; } return par[u][0]; } int dp[maxn + 2]; void DFS(const int u = 1) { int sum = 0; for(const int &v : adj[u]) { if(v == par[u][0]) continue; DFS(v); sum += dp[v]; } dp[u] = sum; for(const auto &[x, y, w] : cands[u]) maxi(dp[u], bit.get(tin[x]) + bit.get(tin[y]) + w + sum); bit.update(tin[u], tout[u], sum - dp[u]); } void solve(void) { init(); pre_DFS(); for(; nq; --nq) { int u, v, w; cin >> u >> v >> w; cands[lca(u, v)].push_back({u, v, w}); } DFS(); cout << dp[1]; } int main() { ios_base::sync_with_stdio(0); cin.tie(nullptr); cout.tie(nullptr); solve(); 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...