제출 #1359738

#제출 시각아이디문제언어결과실행 시간메모리
1359738yusuf12360Fireworks (APIO16_fireworks)C++20
100 / 100
123 ms71436 KiB
#include<bits/stdc++.h>
#define int long long
#define ld long double
#define pii pair<int, int>
#define vi vector<int>
#define vvi vector<vi> 
#define pb push_back
#define fi first
#define se second
#define TII tuple<int, int, int>
#define MT make_tuple
#define mp make_pair
#define ts to_string
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
#define MIN(x) *min_element(all(x))
#define MAX(x) *max_element(all(x))
#define lb lower_bound
#define ub upper_bound
#pragma GCC optimize("O3", "unroll-loops")
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 3e5 + 5;
struct node{
    priority_queue<int> lef;
    priority_queue<int, vi, greater<int>> rig;
    int mn = 0;

    void add(int x) { lef.push(x); rig.push(x); }
    int size() { return sz(lef) + sz(rig); }
} a[N];

vi adj[N];
int par[N], c[N];
priority_queue<int, vi, greater<int>> free_empty[N];
int32_t main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int n, m; cin >> n >> m;
    for(int i = 2; i <= n + m; i++) {
        cin >> par[i] >> c[i];
        adj[par[i]].pb(i);
        if(i > n) a[i].add(c[i]);
    }
    
    for(int u = n; u >= 1; u--) {
        for(int v : adj[u]) {
            if(sz(a[u]) < sz(a[v])) swap(a[u], a[v]);

            a[u].mn += a[v].mn;
            while(!a[v].lef.empty()) {
                int cc = a[v].lef.top(); a[v].lef.pop();
                if(!a[u].rig.empty() && cc > a[u].rig.top()) {
                    int lm = a[u].rig.top(); a[u].rig.pop();
                    a[u].mn += cc - lm;
                    a[u].lef.push(lm);
                    a[u].rig.push(cc);
                } else a[u].lef.push(cc);
            }
            while(!a[v].rig.empty()) {
                int cc = a[v].rig.top(); a[v].rig.pop();
                if(!a[u].lef.empty() && cc < a[u].lef.top()) {
                    int rm = a[u].lef.top(); a[u].lef.pop();
                    a[u].mn += rm - cc;
                    a[u].rig.push(rm);
                    a[u].lef.push(cc);
                } else a[u].rig.push(cc);
            }
        }

        if(u > 1) {
            assert(!a[u].lef.empty() && !a[u].rig.empty());
            int p = a[u].lef.top(); a[u].lef.pop();
            a[u].lef.push(p + c[u]);

            int q = a[u].rig.top();
            swap(a[u].rig, free_empty[u]);
            a[u].rig.push(q + c[u]);
        }
    }
    
    cout << a[1].mn << '\n';
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…