Submission #1298531

#TimeUsernameProblemLanguageResultExecution timeMemory
1298531MinbaevElection Campaign (JOI15_election_campaign)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #define pb push_back #define all(x) x.begin(),x.end() #define ar array #define int long long template<class T>bool umax(T &a,T b){if(a<b){a=b;return true;}return false;} template<class T>bool umin(T &a,T b){if(b<a){a=b;return true;}return false;} template <class T> using ste = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>; const long long inf = 3e18 + 7; const int mod = 1000000007; const int md = 998244353; const int N = 3e5 + 5; struct Bit { vector<int> b, b2; int n; Bit(int n) { this->n = n + 1; b.assign(n + 1, 0); b2.assign(n+1, 0); } void add(vector<int>&b, int idx, int x){ while(idx <= n){ b[idx] += x; idx += idx & -idx; } } void upd(int l, int r, int x){ if(r < l)return; add(b, l, x); add(b, r+1, -x); add(b2, l, x*(l-1)); add(b2, r+1, -x*r); } int sum(vector<int>&b, int idx){ int res = 0; while(idx > 0){ res += b[idx]; idx -= idx & -idx; } return res; } int pref(int idx){ return sum(b, idx) * idx - sum(b2, idx); } int get(int l, int r){ return pref(r) - pref(l-1); } }; int n,m,k; vector<int>g[N], tin(N), tout(N), dp(N), sum(N), sub(N), id(N), anc(N); vector<ar<int,3>>dir[N]; vector<ar<int,5>> unin[N]; vector<vector<int>>p(N, vector<int>(20)); int timer; Bit t(N), t2(N); void dfs(int x, int pr){ sub[x] = 1; tin[x] = ++timer; p[x][0] = pr; for(int i = 1;i<20;i++) p[x][i] = p[p[x][i-1]][i-1]; for(auto to : g[x]){ if(to == pr)continue; dfs(to, x); sub[x] += sub[to]; } tout[x] = ++timer; } bool is(int a, int b){ return tin[a] <= tin[b] && tout[b] <= tout[a]; } void hld(int x, int pr, int a){ anc[x] = a; id[x] = ++timer; int u = -1; for(auto to : g[x]){ if(to == pr)continue; if(u == -1)u = to; else if(sub[to] > sub[u])u = to; } if(u != -1){ hld(u, x, a); } for(auto to : g[x]){ if(to == pr || to == u)continue; hld(to, x, to); } } long long path(int a, int b, Bit &ts){ long long res = 0; while(anc[a] != anc[b]){ res += ts.get(id[anc[a]], id[a]); a = p[anc[a]][0]; } res += ts.get(id[b], id[a]); return res; } int lca(int a, int b){ if(is(a,b)) return a; if(is(b,a)) return b; for(int i = 19; i >= 0; --i){ if(!is(p[a][i], b)) a = p[a][i]; } return p[a][0]; } int lca2(int a, int b){ for(int i = 19;i>=0;i--){ if(!is(p[a][i], b)){ a = p[a][i]; } } return a; } void ans(int x, int pr){ for(auto to : g[x]){ if(to == pr)continue; ans(to, x); dp[x] += dp[to]; sum[x] += dp[to]; } for(auto [a, b, c] : dir[x]){ int sum2 = 0; if(a != b)sum2 = path(b, a, t) - path(b, lca2(b, a), t2); else sum2 = sum[b]; umax(dp[x], sum[x] - dp[a] + sum2 + c); } for(auto [a_, b_, a, b, c] : unin[x]){ int sum2 = 0; if(a != a_)sum2 += path(a, a_, t) - path(a, lca2(a, a_), t2); else sum2 += sum[a]; if(b != b_)sum2 += path(b, b_, t) - path(b, lca2(b, b_), t2); else sum2 += sum[b]; umax(dp[x], sum[x] - dp[a_] - dp[b_] + sum2 + c); } t.upd(id[x], id[x], sum[x]); t2.upd(id[x], id[x], dp[x]); } void solve(){ cin >> n; for(int i = 2;i<=n;i++){ int a,b; cin >> a >> b; g[a].pb(b); g[b].pb(a); } dfs(1, 1); timer = 0; hld(1, -1, 1); int q; cin >> q; while(q--){ int a,b,c; cin >> a >> b >> c; if(tin[a] > tin[b])swap(a, b); int u = lca(a, b); if(is(a, b)) dir[a].pb({lca2(b, a), b, c}); else unin[u].pb({lca2(a, u), lca2(b, u), a, b, c}); } //~ cout << lca2(10, 3) << " " << lca2(13, 4) << " " << lca2(5, 1) << "\n"; //~ for(int i = 1;i<=n;i++){ //~ cout << i << " : \n"; //~ for(auto [a, b, c] : dir[i])cout << a << " " << b << " " << c << "\n"; //~ for(auto [a, b, c, d, e] : unin[i])cout << a << " " << b << " " << c << " " << d << " " << e << "\n"; //~ } ans(1, 1); cout << dp[1] << "\n"; } /* 15 1 2 2 3 3 4 4 5 6 7 2 7 2 8 8 9 10 3 3 11 12 14 13 14 4 15 14 4 5 1 5 25 7 9 10 10 11 10 12 15 10 15 13 115 */ signed main() { // freopen("seq.in", "r", stdin); // freopen("seq.out", "w", stdout); ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL); int tt=1;//cin >> tt; while(tt--)solve(); }