제출 #114075

#제출 시각아이디문제언어결과실행 시간메모리
114075keko37Fireworks (APIO16_fireworks)C++14
100 / 100
345 ms68600 KiB
#include<bits/stdc++.h>

using namespace std;

typedef long long llint;

const int MAXN = 300005;
const llint INF = 1000000000000000LL;

int n, m;
llint p[MAXN], c[MAXN];
llint a[MAXN], b[MAXN];
vector <int> v[MAXN];
priority_queue <llint> hull[MAXN];

void add (int x, int len) {
    int slope = a[x] + hull[x].size();
    llint x1, x2;
    while (slope >= 0) {
        if (slope == 1) x2 = hull[x].top();
        if (slope == 0) x1 = hull[x].top();
        hull[x].pop(); slope--;
    }
    b[x] += len;
    hull[x].push(x1 + len);
    hull[x].push(x2 + len);
}

void spoji (int x, int y) {
    if (hull[x].size() > hull[y].size()) swap(hull[x], hull[y]);
    a[y] += a[x];
    b[y] += b[x];
    while (!hull[x].empty()) {
        hull[y].push(hull[x].top());
        hull[x].pop();
    }
}

void dfs (int x) {
    if (x >= n + 1) {
        a[x] = -1; b[x] = 0;
        hull[x].push(0);
        hull[x].push(0);
        return;
    }
    for (int i=0; i<v[x].size(); i++) {
        int sus = v[x][i];
        dfs(sus);
        add(sus, c[sus]);
        spoji(sus, x);
    }
}

llint upit (int x) {
    vector <llint> r;
    while (!hull[x].empty()) {
        r.push_back(hull[x].top());
        hull[x].pop();
    }
    llint val = b[x], slope = a[x], pos = 0;
    llint sol = val;
    while (!r.empty()) {
        val += slope * (r.back() - pos);
        sol = min(sol, val);
        pos = r.back();
        r.pop_back();
        slope++;
    }
    return sol;
}

int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    for (int i = 2; i <= n+m; i++) {
        cin >> p[i] >> c[i];
        v[p[i]].push_back(i);
    }
    dfs(1);
    cout << upit(1);
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

fireworks.cpp: In function 'void dfs(int)':
fireworks.cpp:46:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0; i<v[x].size(); i++) {
                   ~^~~~~~~~~~~~
fireworks.cpp: In function 'void add(int, int)':
fireworks.cpp:26:21: warning: 'x2' may be used uninitialized in this function [-Wmaybe-uninitialized]
     hull[x].push(x2 + len);
                  ~~~^~~~~
fireworks.cpp:25:21: warning: 'x1' may be used uninitialized in this function [-Wmaybe-uninitialized]
     hull[x].push(x1 + len);
                  ~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...