Submission #953168

#TimeUsernameProblemLanguageResultExecution timeMemory
953168UnforgettableplFireworks (APIO16_fireworks)C++17
100 / 100
459 ms129816 KiB
#include <bits/stdc++.h>

#include <utility>
using namespace std;

#define int long long

struct line{
    int m,n;
    multiset<int> points;
    line():n(0),m(0),points(){}
    line(int m,int n,multiset<int> points):m(m),n(n),points(points){}
    void operator+=(const line &other){
        m+=other.m;
        n+=other.n;
        for(int i:other.points)points.insert(i);
    }
};

int n,m;
vector<pair<int,int>> adj[300001];
line functions[300001];

void dfs(int x,int p){
    if(x>n) {
        functions[x] = {1, -adj[x][0].second, {adj[x][0].second, adj[x][0].second}};
        return;
    }
    int len = 0;

    for(auto&i:adj[x]){
        if(i.first!=p){
            dfs(i.first,x);
            if(functions[i.first].points.size()>functions[x].points.size())swap(functions[x],functions[i.first]);
            functions[x]+=functions[i.first];
        }
        else len = i.second;
    }
    int currsum = functions[x].n;
    int currslope = functions[x].m;
    for(auto i=--functions[x].points.end();i!=functions[x].points.begin();i--){
        currslope--;
        if(currslope==-1)break;
        currsum+=*i;
    }
    while(functions[x].m>1){
        functions[x].m--;
        functions[x].points.erase(--functions[x].points.end());
    }
    int f = *--functions[x].points.end();
    functions[x].points.erase(--functions[x].points.end());
    int s = *--functions[x].points.end();
    functions[x].points.erase(--functions[x].points.end());
    functions[x].points.insert(s+len);
    functions[x].points.insert(f+len);
    functions[x].n = currsum-(f+len);
    functions[x] = functions[x];
}


int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m;
    for(int i=2;i<=n+m;i++){
        int p,c;cin>>p>>c;
        adj[i].emplace_back(p,c);
        adj[p].emplace_back(i,c);
    }
    dfs(1,0);
    line ans = functions[1];
    int currsum = ans.n;
    int currslope = ans.m;
    for(auto i=--ans.points.end();i!=ans.points.begin();i--){
        currslope--;
        if(currslope==-1)break;
        currsum+=*i;
    }
    cout << currsum << '\n';
}

Compilation message (stderr)

fireworks.cpp: In constructor 'line::line()':
fireworks.cpp:9:11: warning: 'line::n' will be initialized after [-Wreorder]
    9 |     int m,n;
      |           ^
fireworks.cpp:9:9: warning:   'long long int line::m' [-Wreorder]
    9 |     int m,n;
      |         ^
fireworks.cpp:11:5: warning:   when initialized here [-Wreorder]
   11 |     line():n(0),m(0),points(){}
      |     ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...