Submission #919910

#TimeUsernameProblemLanguageResultExecution timeMemory
919910CyberCowMagic Tree (CEOI19_magictree)C++17
61 / 100
70 ms86868 KiB
#include <random>
#include <algorithm>
#include <bitset>
#include <chrono>
#include <cmath>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <chrono>
#define fr first
#define sc second
#define ad push_back
using namespace std;
using ll = long long;
mt19937 rnd(348502);

const ll N = 1000005;

vector<ll> v[N];

pair<ll, ll> a[N];

ll dp[2000][2000], k;
int pereadres[N];
int popopopox = 1;
int gagperead[N];
vector<int> taza[N];

///
ll dp1[N][21];

void Dfs1(ll g)
{
    if (a[g].first)
        dp1[g][a[g].first - 1] = a[g].second;
    for (auto to : v[g])
    {
        Dfs1(to);
        for (ll i = 0; i < k; i++)
        {
            dp1[g][i] += dp1[to][i];
        }
    }
    for (ll i = 1; i < k; i++)
    {
        dp1[g][i] = max(dp1[g][i], dp1[g][i - 1]);
    }
}
///

void Dfs(ll g)
{
    if(a[g].first)
        dp[gagperead[g]][pereadres[a[g].first]] = a[g].second;
    for (auto to : taza[gagperead[g]])
    {
        Dfs(to);
        for (ll i = 0; i < popopopox; i++)
        {
            dp[gagperead[g]][i] += dp[gagperead[to]][i];
        }
    }
    for (ll i = 1; i < popopopox; i++)
    {
        dp[gagperead[g]][i] = max(dp[gagperead[g]][i], dp[gagperead[g]][i - 1]);
    }
}

ll s[4 * N];

ll get_max(int p, int lp, int rp, int l, int r)
{
    if (l > r)return 0;
    if (lp == l && rp == r)
        return s[p];
    int m = (lp + rp) / 2;
    return max(get_max(p * 2, lp, m, l, min(m, r)), get_max(p * 2 + 1, m + 1, rp, max(m + 1, l), r));
}

void update(int p, int lp, int rp , int ind, ll arj)
{
    if (lp == rp)
    {
        s[p] = arj;
        return;
    }
    int m = (lp + rp) / 2;
    if (ind <= m)
        update(p * 2, lp, m, ind, arj);
    else
        update(p * 2 + 1, m + 1, rp, ind, arj);
    s[p] = max(s[p * 2], s[p * 2 + 1]);
}

int neeew = 1;

void Dfspereadres(int g, int naxk)
{
    if (a[g].first != 0 || g == 1)
    {
        gagperead[g] = neeew++;
    }
    if (a[g].first != 0 && naxk != g)
    {
        taza[naxk].push_back(g);
    }
    for (auto to : v[g])
    {
        if (a[g].first == 0)
            Dfspereadres(to, naxk);
        else
            Dfspereadres(to, gagperead[g]);
    }
}

int kachka[N];

void solve()
{
    ll n, i, j, m, x, y, z;
    cin >> n >> m >> k;


    if (m <= 1000)
    {
        for (i = 0; i < n - 1; i++)
        {
            cin >> x;
            v[x].push_back(i + 2);
        }
        for (i = 0; i < m; i++)
        {
            cin >> x >> y >> z;
            kachka[y] = 1;
            a[x] = { y, z };
        }
        for ( i = 1; i <= k; i++)
        {
            if (kachka[i] == 1)
            {
                pereadres[i] = popopopox++;
            }
        }
        Dfspereadres(1, 1);
        Dfs(1);
        cout << dp[1][popopopox - 1];
        return;
    }
    if (k <= 20)
    {
        for (i = 0; i < n - 1; i++)
        {
            cin >> x;
            v[x].push_back(i + 2);
        }
        for (i = 0; i < m; i++)
        {
            cin >> x >> y >> z;
            a[x] = { y, z };
        }
        Dfs1(1);
        cout << dp1[1][k - 1];
        return;
    }
    ll ans = 0;
    int st = 1;
    for (i = 0; i < n - 1; i++)
    {
        cin >> x;
        if (x != i + 1)
            st = 0;
        v[x].push_back(i + 2);
    }
    for (i = 0; i < m; i++)
    {
        cin >> x >> y >> z;
        a[x] = { y, z };
        ans += z;
    }
    if (st == 0)
    {
        cout << ans;
        return;
    }
    for (i = n; i > 0; i--)
    {
        if (a[i].first)
            update(1, 0, k, a[i].first, a[i].second + get_max(1, 0, k, 0, a[i].first));
    }
    cout << get_max(1, 0, k, 0, k);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    ll tt = 1;
    //cin >> tt;
    while (tt--) {
        solve();
    }
    return 0;
}

Compilation message (stderr)

magictree.cpp: In function 'void solve()':
magictree.cpp:130:14: warning: unused variable 'j' [-Wunused-variable]
  130 |     ll n, i, j, m, x, y, z;
      |              ^
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...