Submission #728104

#TimeUsernameProblemLanguageResultExecution timeMemory
728104josanneo22Fireworks (APIO16_fireworks)C++17
100 / 100
318 ms74420 KiB
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <functional>
#include <numeric>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <string>
#include <bitset>
#include <map>
#include <set>
using namespace std;
typedef long long lint;
typedef long double llf;
typedef pair<int, int> pi;
const lint inf = 1e16;

int n, m, sz[300005];
lint dep[300005], c[300005];

vector<int> gph[300005];

struct func {
    priority_queue<lint> pq;
    lint cost;
    int slope;
    void init() {
        cost = 0;
        slope = -1;
        pq.push(0);
        pq.push(0);
    }
    void upperize(int x) {
        cost += c[x];
        while (!pq.empty() && slope + (int)pq.size() > 1) {
            pq.pop();
        }
        vector<lint> v;
        while (!pq.empty() && slope + (int)pq.size() >= 0) {
            v.push_back(pq.top());
            pq.pop();
        }
        while (!v.empty()) {
            pq.push(v.back() + c[x]);
            v.pop_back();
        }
    }
}dp[300005];

bool cmp(int a, int b) {
    return sz[a] > sz[b];
}

void dfs(int x) {
    if (x > n) {
        sz[x] = 1;
        return;
    }
    for (int i = 0; i < gph[x].size(); i++) {
        dep[gph[x][i]] = dep[x] + c[gph[x][i]];
        dfs(gph[x][i]);
        sz[x] += sz[gph[x][i]];
    }
    sort(gph[x].begin(), gph[x].end(), cmp);
}

int solve(int x) {
    if (x > n) {
        dp[x].init();
        return x;
    }
    int ret = solve(gph[x][0]);
    dp[ret].upperize(gph[x][0]);
    for (int i = 1; i < gph[x].size(); i++) {
        int t = solve(gph[x][i]);
        dp[t].upperize(gph[x][i]);
        dp[ret].cost += dp[t].cost;
        dp[ret].slope += dp[t].slope;
        while (!dp[t].pq.empty()) {
            dp[ret].pq.push(dp[t].pq.top());
            dp[t].pq.pop();
        }
    }
    return ret;
}

int main() {
    cin >> n >> m;
    for (int i = 2; i <= n + m; i++) {
        int p;
        scanf("%d %lld", &p, &c[i]);
        gph[p].push_back(i);
    }
    dfs(1);
    func ret = dp[solve(1)];
    ret.upperize(0);
    lint ansp = ret.pq.top();
    lint ans = ret.cost + ansp * ret.slope;
    while (!ret.pq.empty()) {
        ans += ansp - ret.pq.top();
        ret.pq.pop();
    }
    printf("%lld", ans);
}

Compilation message (stderr)

fireworks.cpp: In function 'void dfs(int)':
fireworks.cpp:67:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     for (int i = 0; i < gph[x].size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~
fireworks.cpp: In function 'int solve(int)':
fireworks.cpp:82:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |     for (int i = 1; i < gph[x].size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~
fireworks.cpp: In function 'int main()':
fireworks.cpp:99:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |         scanf("%d %lld", &p, &c[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...