Submission #1284876

#TimeUsernameProblemLanguageResultExecution timeMemory
1284876trantrungkeinElection Campaign (JOI15_election_campaign)C++20
100 / 100
310 ms43184 KiB
#include <bits/stdc++.h>
#define int long long
#define fi           first
#define si           second
#define For(i,a,b)   for (int i = (a), _b =(b); i <= _b; ++i)
#define all(v)       v.begin(), v.end()
#define Unique(v)    v.erase(unique(all(v)), v.end())
#define MASK(i)      (1LL << (i))
#define bit(i,n)     (((n)>>(i)) & 1)
#define Vii          vector<pair<int,int>>
#define setpr(x)     cout<<setprecision(x)<<fixed
#define Prior        priority_queue< pair<int,int> , Vii, greater<Pair> >
using namespace std;

const int Mod = 1E9 + 7;
const long long INF  = 4E18;
const int N = 4e5 + 1;
const int Log = 20;
int dept[N],up[N][Log+2];
int in[N],out[N],Time = 0;
vector<int> g[N];
void dfs_lca(int u, int p)
{
    up[u][0] = p;
    in[u] = ++Time;
    for(int i = 1; i <= Log; i++) up[u][i] = up[up[u][i-1]][i-1];
    for(int v : g[u]) if(v != p)
    {
        dept[v] = dept[u] + 1;
        dfs_lca(v,u);
    }
    out[u] = ++Time;
}
int LCA(int u, int v)
{
    if(dept[u] < dept[v]) swap(u,v);
    int LenK = dept[u] - dept[v];
    for(int i = Log; i >= 0; i--) if(LenK&(1<<i)) u = up[u][i];
    if(u == v) return u;
    for(int i = Log; i >= 0; i--) if(up[u][i] != up[v][i])
    {
        u = up[u][i];
        v = up[v][i];
    }
    return up[u][0];
}

int n,m;
vector<array<int,3>> query[N];
//BIT
int BIT[N];
void update_sum(int id, int val)
{
    for(;id <= 2*n; id += -id&id) BIT[id] += val;
}
int sumBIT(int id)
{
    int sum = 0;
    for(;id > 0; id -= -id&id) sum += BIT[id];
    return sum;
}
int get_sum(int l, int r)
{
    return sumBIT(r)-sumBIT(l-1);
}

int BIT2[N];
void update(int id, int val)
{
    for(;id <= 2*n; id += -id&id) BIT2[id] += val;
}
int sum(int id)
{
    int sum = 0;
    for(;id > 0; id -= -id&id) sum += BIT2[id];
    return sum;
}
int get(int l, int r)
{
    return sum(r)-sum(l-1);
}
int dp[N];
int getpath(int l, int r, int u)
{
    return get_sum(in[u],in[l]) + get_sum(in[u],in[r])  - get(in[u],in[l]) - get(in[u],in[r]) - get_sum(in[u],in[u]) + get(in[u],in[u]);
}
//
void dfs(int u, int p){
    int sum = 0;
    for(int v : g[u]) if(v != p)
    {
        dfs(v,u);
        sum += dp[v];
    }
    dp[u] = sum;
    update_sum(in[u],sum);
    update_sum(out[u],-sum);
    for(auto [l,r,c] : query[u]){
        dp[u] = max(dp[u],getpath(l,r,u) + c);
        //cerr <<"a "<< l << ' '  << r <<' ' << c << endl;
       // cerr << getpath(l,r,u) << endl;
    }
   // cerr << u <<' ' << dp[u] <<' ' << sum <<' ' << endl;
    update(in[u],dp[u]);
    update(out[u],-dp[u]);
}
int32_t main()
{
    cin >> n;
    for(int i = 1; i < n; i++){
        int u,v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs_lca(1,0);
    cin >> m;
    for(int i = 1; i <= m; i++)
    {   int u,v,c;
        cin >> u >> v >> c;
        int anc = LCA(u,v);
        query[anc].push_back({u,v,c});
    }
    dfs(1,0);
    cout << dp[1];

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