Submission #1249385

#TimeUsernameProblemLanguageResultExecution timeMemory
1249385nguyenhuythachElection Campaign (JOI15_election_campaign)C++20
100 / 100
120 ms40008 KiB
//y tuong cua from khanh nguyen
#include<bits/stdc++.h>
#include<algorithm>
#include<random>
#include<chrono>
#include<cstdlib>
#include<ctime>
#include<numeric>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<iomanip>
#define int long long
#define ll long long
#define L LLONG_MAX
#define fi first
#define se second
#define pii pair<int,int>
#define sz(a) ((int)a.size())
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define REP(i,k,j) for(int i=k;i>=j;i--)
#define FORD(i,a) for(auto i:a)
#define rngdcl mt19937_64 rng(chrono::steady_clock::now().time_asince_epoch().count())
#define random(l,r) ((l)+(rng()%(r-l+1)))
using namespace std;
struct dt
{
    int u,v,c;
};

const int nmax=1e5+1;
int n,m,t=0;
vector<int> adj[nmax];
vector<dt> qr[nmax];
int depth[nmax],jump[nmax][20],f[nmax],tin[nmax],tout[nmax];

void pre_dfs(int u,int v)
{
    tin[u]=++t;
    for(auto i:adj[u])
    {
        if(i==v) continue;
        depth[i]=depth[u]+1;
        pre_dfs(i,u);
        jump[i][0]=u;
    }
    tout[u]=t;
}

void buildjump()
{
    FOR(i,1,log2(n)) FOR(u,1,n) jump[u][i]=jump[jump[u][i-1]][i-1];
}

int lca(int u,int v)
{
    if(depth[v]<depth[u]) swap(u,v);
    int dis=depth[v]-depth[u];
    REP(i,log2(n)+1,0) if(dis&(1<<i)) v=jump[v][i];
    if(u==v) return u;
    REP(i,log2(n)+1,0)
    {
        if(jump[v][i]==0 || jump[u][i]==0) continue;
        if(jump[u][i]!=jump[v][i])
        {
            u=jump[u][i];
            v=jump[v][i];
        }
    }
    return jump[u][0];
}

struct BIT
{
    vector<int> tree;
    int n;
    
    BIT (int N)
    {
        n=N;
        tree.resize(n+4,0);
    }
    
    void update(int x,int val)
    {
        while(x<=n)
        {
            tree[x]+=val;
            x+=(x&-x);
        }
    }
    
    int get(int x)
    {
        int ans=0;
        while(x>0)
        {
            ans+=tree[x];
            x-=(x&-x);
        }
        return ans;
    }
} res(0),total(0);

void input()
{
    cin >> n;
    FOR(i,1,n-1)
    {
        int u,v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    pre_dfs(1,0);
    buildjump();
    cin >> m;
    FOR(i,1,m)
    {
        int u,v,c; cin >> u >> v >> c;
        int LCA=lca(u,v);
        qr[LCA].push_back({u,v,c});
    }
}

void dfs(int u,int v)
{
    int ans=0;
    FORD(i,adj[u])
    {
        if(i==v) continue;
        dfs(i,u);
        ans+=res.get(tin[i]);
    }
    
    FORD(i,qr[u])
    {
        int save=i.c+f[u]+total.get(tin[i.u])+total.get(tin[i.v])-res.get(tin[i.u])-res.get(tin[i.v]);
        ans=max(ans,save);
    }
    res.update(tin[u],ans);
    res.update(tout[u]+1,-ans);
    f[v]+=ans;
    total.update(tin[u],f[u]);
    total.update(tout[u]+1,-f[u]);
}

void solve()
{
    res=BIT(n);
    total=BIT(n);
    dfs(1,0);
    cout << res.get(1);
}

signed main()
{
    //freopen(".inp", "r", stdin);
    //freopen(".out", "w", stdout);
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    input();
    solve();
}

#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...