제출 #240646

#제출 시각아이디문제언어결과실행 시간메모리
240646aggu_01000101Election Campaign (JOI15_election_campaign)C++14
10 / 100
180 ms42468 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define INF 100000000000000000
#define int long long
#define lchild(i) (i*2 + 1)
#define rchild(i) (i*2 + 2)
#define mid(l, u) ((l+u)/2)
#define x(p) p.first
#define y(p) p.second
#define MOD 998244353
#define ordered_set tree<pair<int, int>, null_type,less<pair<int, int>>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
struct plan{
    int A, B, C, lca;
};
const int N = 1e5 + 5;
int n, m;
vector<int> adj[N];
int seg[10*N];
int dep[N];
int ind[N];
int dp[N][2]; //0 -> without including i, 1 -> including i
plan plans[N];
vector<int> ett;
vector<pair<int, int>> children[N];
vector<plan> PlansHere[N];
int merge(int l, int u){
    return (dep[l]<=dep[u]) ? l : u;
}
int build(int l, int u, int i){
    if(l==u) return seg[i] = ett[l];
    else return seg[i] = merge(build(l, mid(l, u), lchild(i)), build(mid(l, u)+1, u, rchild(i)));
}
int query(int l, int u, int i, int ll, int uu){
    //cout<<l<<" "<<u<<" "<<ll<<" "<<uu<<endl;
    if(l>=ll && u<=uu) return seg[i];
    if(uu<=mid(l, u)) return query(l, mid(l, u), lchild(i), ll, uu);
    if(ll>mid(l, u)) return query(mid(l, u)+1, u, rchild(i), ll, uu);
    return merge(query(l, mid(l, u), lchild(i), ll, uu), query(mid(l, u)+1, u, rchild(i), ll, uu));
}
int LCA(int x, int y){
    return query(0, ett.size() - 1, 0, min(ind[x], ind[y]), max(ind[x], ind[y]));
}
void buildLCA(){
    build(0, ett.size()-1, 0);
}
void euler_tour(int i, int p, int d){
    dep[i] = d;
    ind[i] = ett.size();
    ett.push_back(i);
    for(int j: adj[i]){
        if(j==p) continue;
        children[i].push_back({ett.size(), j});
        euler_tour(j, i, d+1);
        ett.push_back(i);
    }
}
int findChild(int i, int j){
    //find the child of i that contains j
    int ans = -1;
    int lo = 0;
    int hi = children[i].size() - 1;
    while(lo<=hi){
        int mid = mid(lo, hi);
        //cout<<lo<<" "<<hi<<"\n";
        //cout<<i<<" "<<j<<" "<<children[i][mid].first<<" "<<ind[j]<<"\n";
        if(children[i][mid].first <= ind[j]){
            //cout<<children[i][mid].second<<"\n";
            ans = max(ans, mid);
            lo = mid + 1;
        }
        else hi = mid - 1;
    }
    //cout<<i<<" is connected to "<<j<<" through "<<(children[i][ans].second)<<endl;
    return children[i][ans].second;
}
int dfs(int i){
    dp[i][0] = 0;
    for(pair<int, int> j: children[i]){
        dp[i][0] += dfs(j.second);
    }
    int maxi = dp[i][0];
    for(plan k: PlansHere[i]){
        int acontr = 0;
        int bcontr = 0;
        int plancontr = k.C;

        if(k.A != i){
            acontr += dp[k.A][0];
            acontr -= dp[findChild(i, k.A)][1];
        }
        if(k.B != i){
            bcontr += dp[k.B][0];
            bcontr -= dp[findChild(i, k.B)][1];
        }
        maxi = max(maxi, dp[i][0] + acontr + bcontr + plancontr);
    }
    dp[i][1] = maxi;
    return dp[i][1];
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n;
    for(int i = 1;i<n;i++){
        int x, y;
        cin>>x>>y;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }
    euler_tour(1, 0, 0);
    buildLCA();
    cin>>m;
    for(int i = 0;i<m;i++){
        cin>>plans[i].A>>plans[i].B>>plans[i].C;
        //cout<<"Done taking input"<<endl;
        plans[i].lca = LCA(plans[i].A, plans[i].B);
        //cout<<"Done calculating LCA"<<endl;
        PlansHere[plans[i].lca].push_back(plans[i]);
        //cout<<"Done pushing back"<<endl;
    }
    cout<<dfs(1)<<"\n";
}
/*
7
3 4
6 5
2 7
1 5
7 5
4 5
5
4 3 10
5 6 5
2 6 9
7 2 2
1 3 8

8
1 2
2 3
3 4
4 5
5 6
6 7
7 8
5
7 5 4
5 8 9
4 3 9
1 3 3
2 8 11

20
17 10
11 4
8 3
3 16
1 14
15 18
5 4
6 18
10 18
19 4
16 7
2 13
4 12
12 20
9 20
18 13
20 14
14 7
13 7
15
19 9 2341
13 8 6974
8 3 3339
15 17 6515
10 13 4370
1 7 8376
18 2 9272
6 7 4595
1 20 505
10 9 308
6 19 8937
2 15 5072
5 4 4217
2 4 4170
19 12 8204
*/
#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...