Submission #475193

#TimeUsernameProblemLanguageResultExecution timeMemory
475193nicolaalexandraElection Campaign (JOI15_election_campaign)C++14
100 / 100
320 ms54816 KiB
#include <bits/stdc++.h>
#define DIM 100010
using namespace std;

vector <int> L[DIM];
pair <int,int> rmq[25][DIM*3],poz[DIM];
int E[DIM*3],p[DIM*3],level[DIM],first[DIM],aib[DIM],sp[DIM],dp[DIM];

struct idk{
    int x,y,cost;
};

vector <idk> v[DIM];

int n,m,i,j,x,y,cost,k,idx;

void dfs (int nod, int tata){

    level[nod] = 1 + level[tata];
    E[++k] = nod;
    first[nod] = k;

    poz[nod].first = ++idx;

    for (auto vecin : L[nod])
        if (vecin != tata){
            dfs (vecin,nod);
            E[++k] = nod;
        }

    poz[nod].second = idx;
}

int get_lca (int x, int y){
    int posx = first[x], posy = first[y];
    if (posx > posy)
        swap (posx,posy);
    int nr = p[posy-posx+1];
    pair <int,int> sol = min (rmq[nr][posx],rmq[nr][posy-(1<<nr)+1]);
    return E[sol.second];
}

void update (int p, int val){
    for (;p<=n;p+=(p&-p))
        aib[p] += val;
}

int query (int p){
    int sol = 0;
    for (;p;p-=(p&-p))
        sol += aib[p];
    return sol;
}

void dfs2 (int nod, int tata){
    for (auto vecin : L[nod])
        if (vecin != tata){
            dfs2 (vecin,nod);
            sp[nod] += dp[vecin];
        }

    dp[nod] = sp[nod]; /// inca nu iau un lant care are lca in nod

    for (auto it : v[nod]){
        int x = it.x, y = it.y, cost = it.cost;
        dp[nod] = max (dp[nod],query(poz[x].first) + query(poz[y].first) + cost + sp[nod]);
    }

    update (poz[nod].first, sp[nod] - dp[nod]);
    update (poz[nod].second+1, dp[nod] - sp[nod]);

}

int main (){

    //ifstream cin ("date.in");
    //ofstream cout ("date.out");

    cin>>n;
    for (i=1;i<n;i++){
        cin>>x>>y;
        L[x].push_back(y);
        L[y].push_back(x);
    }

    dfs (1,0);

    for (i=1;i<=k;i++)
        rmq[0][i] = make_pair(level[E[i]],i);

    for (i=1;(1<<i)<=k;i++)
        for (j=1;j<=k;j++){
            rmq[i][j] = rmq[i-1][j];
            if (j + (1<<(i-1)) <= k && rmq[i-1][j + (1<<(i-1))].first < rmq[i][j].first)
                rmq[i][j] = rmq[i-1][j + (1<<(i-1))];
        }

    for (i=2;i<=k;i++)
        p[i] = p[i/2] + 1;


    cin>>m;
    for (i=1;i<=m;i++){
        cin>>x>>y>>cost;
        v[get_lca(x,y)].push_back({x,y,cost});
    }

    dfs2 (1,0);

    cout<<dp[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...