제출 #1326511

#제출 시각아이디문제언어결과실행 시간메모리
1326511absolut3Fireworks (APIO16_fireworks)C++20
0 / 100
1 ms332 KiB
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ld long double
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define srt(x) sort(all(x))
#define sz(x) (ll)(x.size())
#define pii pair < int, int >
#define pll pair < ll, ll >

#define debug(x) cerr << (#x) << " = " << (x) << endl

const int mod = 1e9 + 7;
const int N = 1e5+1;
const ll OO = 1e18;

template<typename T>
bool umn (T &fi, T se) { return fi > se ? (fi = se, 1) : 0; }

template<typename T>
bool umx (T &fi, T se) { return fi < se ? (fi = se, 1) : 0; }

int n, m;
vector < pii > g[N];
pll res[N];
ll add[N], w[N];

int calc (int i, int l, int r) {
    if (!r || l <= i && i <= r)
        return 0;
    return min(abs(i - l), abs(i - r));
}

void dfs (int v) {
    map < ll, int > mp;
    for (auto [u, wi] : g[v]) {
        w[u] = w[v] + wi;
        dfs(u);
        add[v] += add[u];
        if (res[u].first) {
            mp[w[v]]++;
            mp[res[u].first]--;
            mp[res[u].second]--;
        }
    }
    if (v > n) {
        res[v] = {w[v], w[v]};
    } else {
        res[v] = {10000, 0};
        ll mn = OO;
        for (int i = w[v]; i <= 305; ++i) {
            ll ri = 0;
            for (auto [u, wi] : g[v])
                ri += calc(i, res[u].first, res[u].second);
            umn(mn, ri);
        }
        for (int i = w[v]; i <= 305; ++i) {
            ll ri = 0;
            for (auto [u, wi] : g[v])
                ri += calc(i, res[u].first, res[u].second);
            if (ri == mn) {
                umn(res[v].first, (ll)i);
                umx(res[v].second, (ll)i);
            }
        }
        add[v] += mn;
    }

}

void slv () {
    cin >> n >> m;
    for (int i = 1, p, c; i < n + m; ++i) {
        cin >> p >> c;
        g[p - 1].pb({i, c});
    }
    dfs(0);
    cout << add[0];
}

signed main () {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int test = 1;
//    cin >> test;
    while (test--) {
        slv();
        cout << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...