제출 #1229283

#제출 시각아이디문제언어결과실행 시간메모리
1229283avohadoElection Campaign (JOI15_election_campaign)C++20
100 / 100
112 ms34888 KiB
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define maxn 200005
#define f first
#define s second
#define ll long long
#define pb(x) push_back(x)
vector<int> g[maxn];
int  bit[maxn], up[maxn][20], n, m, timer=1, in[maxn], out[maxn];
long long dp[maxn][2];
vector<pair<pair<int, int>,int>> o[maxn];
void dfs1(int u, int p){
    in[u]=timer;timer++;
    up[u][0]=p;
    for(int i=1; i<20; i++){
        up[u][i]=up[up[u][i-1]][i-1];
    }
    for(auto i:g[u]){
        if(i!=p){
            dfs1(i, u);
        }
    }
    out[u]=timer;
}
int lca(int u, int v){
    int p, l;
    if(in[u]>in[v]){
     p=u;l=v;}
    else{
    p=v;l=u;}
    for(int i=19; i>=0; i--){
        if(in[up[p][i]]>in[l]){
            p=up[p][i];
        }
    }
    return up[p][0];
}
long long get(int l){
    int i=l;
    long long ans=0;
    while(i!=0){
        ans+=bit[i];
        i-=(i&-i);
    }
    return ans;
}
void upd(int i, int x){
    int l=i;
    while(l<=n){
        bit[l]+=x;
        l+=(l&-l);
    }
}
void dfs(int u, int p){
    for(auto v:g[u]){
        if(v!=p){
            dfs(v, u);
            dp[u][0]+=dp[v][1];
        }
    }
    dp[u][1]=dp[u][0];
    for(auto i:o[u]){
        dp[u][1]=max(dp[u][1], dp[u][0]+get(in[i.f.s])+get(in[i.f.f])+i.s);
    }
    upd(in[u], dp[u][0]-dp[u][1]);
    upd(out[u], dp[u][1]-dp[u][0]);
}
void solve(){
    cin >> n;
    for(int i=1; i<n; i++){
        int u, v;
        cin >> u >> v;
        g[u].pb(v);
        g[v].pb(u);
    }
    dfs1(1, 0);
    cin >> m;
    for(int i=0; i<m; i++){
        int u, v, p, c;
        cin >> u >> v >> c;
        p=lca(u, v);
        o[p].push_back({{u, v}, c});
    }
    dfs(1, 0);
    cout << max(dp[1][0], dp[1][1]);
}
int main(){
    cin.tie(nullptr)->sync_with_stdio(0);
    int t=1;
    //cin >> t;
    while(t--){
        solve();
        cout << "\n";
    }
    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...