Submission #1248215

#TimeUsernameProblemLanguageResultExecution timeMemory
1248215chikien2009Election Campaign (JOI15_election_campaign)C++20
100 / 100
313 ms30320 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

struct SEGMENT_TREE
{
    int tree[400000];
    inline void Update(int ind, int l, int r, int x, int y, int v)
    {
        if (r < x || y < l)
        {
            return;
        }
        if (x <= l && r <= y)
        {
            tree[ind] += v;
            return;
        }
        int m = (l + r) >> 1;
        Update(ind << 1, l, m, x, y, v);
        Update(ind << 1 | 1, m + 1, r, x, y, v);
    }
    inline int Get(int ind, int l, int r, int x)
    {
        if (l == r)
        {
            return tree[ind];
        }
        tree[ind << 1] += tree[ind];
        tree[ind << 1 | 1] += tree[ind];
        tree[ind] = 0;
        int m = (l + r) >> 1;
        if (x <= m)
        {
            return Get(ind << 1, l, m, x);
        }
        return Get(ind << 1 | 1, m + 1, r, x);
    }
} st;

int n, m, x[100000], y[100000], a, b, f[100000], h[100000], v[100000];
int head[100000], tail[100000], sp[20][100000];
vector<int> g[100000], q[100000];

inline int LCA(int ina, int inb)
{
    if (head[ina] <= head[inb] && tail[inb] <= tail[ina])
    {
        return ina;
    }
    for (int i = 19, j; i >= 0; --i)
    {
        j = sp[i][ina];
        if (head[j] > head[inb] || tail[inb] > tail[j])
        {
            ina = j;
        }
    }
    return sp[0][ina];
}

inline void DFS1(int node, int par)
{
    head[node] = a++;
    sp[0][node] = par;
    for (int i = 1; i < 20; ++i)
    {
        sp[i][node] = sp[i - 1][sp[i - 1][node]];
    }
    for (auto &i : g[node])
    {
        if (i != par)
        {
            DFS1(i, node);
        }
    }
    tail[node] = a - 1;
}

inline void DFS2(int node, int par)
{
    h[node] = 0;
    for (auto &i : g[node])
    {
        if (i != par)
        {
            DFS2(i, node);
            h[node] += f[i];
        }
    }
    f[node] = h[node];
    for (auto &i : q[node])
    {
        f[node] = max(f[node], h[node] + st.Get(1, 1, n, head[x[i]]) + st.Get(1, 1, n, head[y[i]]) + v[i]);
    }
    st.Update(1, 1, n, head[node], tail[node], h[node] - f[node]);
}

int main()
{
    setup();

    cin >> n;
    for (int i = 0; i < n - 1; ++i)
    {
        cin >> a >> b;
        g[a - 1].push_back(b - 1);
        g[b - 1].push_back(a - 1);
    }
    a = 1;
    DFS1(0, 0);
    cin >> m;
    for (int i = 0; i < m; ++i)
    {
        cin >> x[i] >> y[i] >> v[i];
        x[i]--;
        y[i]--;
        a = LCA(x[i], y[i]);
        q[a].push_back(i);
    }
    DFS2(0, 0);
    cout << f[0];
    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...