Submission #924082

#TimeUsernameProblemLanguageResultExecution timeMemory
924082KiaRezElection Campaign (JOI15_election_campaign)C++17
100 / 100
302 ms48844 KiB
/* IN THE NAME OF GOD */ #include <bits/stdc++.h> // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef pair<int, int> pii; typedef long double ld; #define F first #define S second #define Mp make_pair #define pb push_back #define pf push_front #define size(x) ((ll)x.size()) #define all(x) (x).begin(),(x).end() #define kill(x) cout << x << '\n', exit(0); #define fuck(x) cout << "(" << #x << " , " << x << ")" << endl #define endl '\n' const int N = 2e5+23, lg = 18; ll Mod = 1e9+7; //998244353; inline ll MOD(ll a, ll mod=Mod) {a%=mod; (a<0)&&(a+=mod); return a;} inline ll poww(ll a, ll b, ll mod=Mod) { ll ans = 1; a=MOD(a, mod); while (b) { if (b & 1) ans = MOD(ans*a, mod); b >>= 1; a = MOD(a*a, mod); } return ans; } ll n, m, fen[N], dp[N], sum[N]; int tim, tin[N], tout[N], h[N], par[lg][N]; vector<int> adj[N]; vector<vector<ll>> vec[N]; void upd(int pos, ll val) {while(pos<N) {fen[pos]+=val; pos+=(pos&(-pos));}} ll qry(int pos) { ll res = 0; while(pos > 0) {res += fen[pos]; pos-=(pos&(-pos));} return res; } void add(int l, int r, ll val) {upd(l, val); upd(r, -val);} int getPar(int v, int dist) { for(int i=0; i<lg; i++) { if((dist>>i)%2==1) v=par[i][v]; } return v; } int LCA(int v, int u) { if(h[u]<h[v]) swap(v,u); u = getPar(u, h[u]-h[v]); if(v==u) return v; for(int i=lg-1; i>=0; i--) { if(par[i][v] != par[i][u]) v=par[i][v], u=par[i][u]; } return par[0][v]; } void init(int v, int p=0) { par[0][v] = p, h[v] = h[p] + 1, tin[v] = ++tim; for(int i=1; i<lg; i++) { par[i][v] = par[i-1][par[i-1][v]]; } for(int u : adj[v]) { if(u == p) continue; init(u, v); } tout[v] = tim+1; } void dfs(int v, int p=0) { for(int u : adj[v]) { if(u == p) continue; dfs(u, v); dp[v] += dp[u]; sum[v] += dp[u]; } for(auto it : vec[v]) { int a,b; if(it[0]!=v) a=getPar(it[0],h[it[0]]-h[v]-1); else a = 0; if(it[1]!=v) b=getPar(it[1],h[it[1]]-h[v]-1); else b = 0; dp[v] = max(dp[v], qry(tin[it[0]])+qry(tin[it[1]])+it[2]+sum[v]-dp[a]-dp[b]); } add(tin[v], tin[v]+1, sum[v]); for(int u : adj[v]) { if(u == p) continue; add(tin[u], tout[u], sum[v]-dp[u]); } } int main () { // ios_base::sync_with_stdio(false), cin.tie(0); cin>>n; for(int v,u,i=1; i<n; i++) { cin>>v>>u; adj[v].pb(u); adj[u].pb(v); } init(1); cin>>m; for(int a,b,c,i=1; i<=m; i++) { cin>>a>>b>>c; vec[LCA(a, b)].pb({a, b, c}); } 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...