Submission #1217251

#TimeUsernameProblemLanguageResultExecution timeMemory
1217251AlgorithmWarriorElection Campaign (JOI15_election_campaign)C++20
100 / 100
160 ms26588 KiB
#include <bits/stdc++.h>

using namespace std;

int const NMAX=100005;
int const LOG=20;
int n,m;
vector<int>tree[NMAX];

void read(){
    cin>>n;
    int i;
    for(i=1;i<n;++i){
        int u,v;
        cin>>u>>v;
        tree[u].push_back(v);
        tree[v].push_back(u);
    }
}

int lift[NMAX][LOG];
int h[NMAX];
int tin[NMAX],tout[NMAX];

void dfs(int nod){
    int i;
    static int time=0;
    tin[nod]=++time;
    for(i=1;i<LOG;++i)
        lift[nod][i]=lift[lift[nod][i-1]][i-1];
    for(auto fiu : tree[nod])
        if(fiu!=lift[nod][0]){
            lift[fiu][0]=nod;
            h[fiu]=h[nod]+1;
            dfs(fiu);
        }
    tout[nod]=time;
}

struct path{
    int u,v,cost;
}paths[NMAX];
vector<int>ids[NMAX];

int lca(int u,int v){
    if(h[u]<h[v])
        swap(u,v);
    int dh=h[u]-h[v];
    int i;
    for(i=0;i<LOG;++i)
        if(dh&(1<<i))
            u=lift[u][i];
    if(u==v)
        return u;
    for(i=LOG-1;i>=0;--i)
        if(lift[u][i]!=lift[v][i]){
            u=lift[u][i];
            v=lift[v][i];
        }
    return lift[u][0];
}

void read_paths(){
    cin>>m;
    int i;
    for(i=1;i<=m;++i){
        int u,v,cost;
        cin>>u>>v>>cost;
        paths[i]={u,v,cost};
        ids[lca(u,v)].push_back(i);
    }
}

int ub(int x){
    return x&(-x);
}

struct fenwick_tree{
    long long v[NMAX];
    void upd(int pos,long long val){
        while(pos<=n){
            v[pos]+=val;
            pos+=ub(pos);
        }
    }
    long long qry(int pos){
        long long s=0;
        while(pos){
            s+=v[pos];
            pos-=ub(pos);
        }
        return s;
    }
}aib;

void maxself(long long& x,long long val){
    if(x<val)
        x=val;
}

long long solve(int nod){
    long long sum=0;
    for(auto fiu : tree[nod])
        if(fiu!=lift[nod][0])
            sum+=solve(fiu);
    long long ans=0;
    for(auto id : ids[nod]){
        auto [u,v,cost]=paths[id];
        maxself(ans,cost+aib.qry(tin[u])+aib.qry(tin[v]));
    }
    aib.upd(tin[nod],-ans);
    aib.upd(tout[nod]+1,ans);
    return ans+sum;
}

int main()
{
    read();
    dfs(1);
    read_paths();
    cout<<solve(1);
    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...