Submission #61185

#TimeUsernameProblemLanguageResultExecution timeMemory
61185istleminFireworks (APIO16_fireworks)C++14
55 / 100
2063 ms11736 KiB
#include<bits/stdc++.h>

using namespace std;

#define rep(i,a,b) for(int i = a; i<int(b);++i)
#define all(v) v.begin(),v.end()
#define sz(v) v.size()
#define trav(a,c) for(auto a: c)

typedef long long ll;
typedef vector<ll> vi;
typedef pair<ll,ll> pii;

vector<vector<pii> > e;

tuple<multiset<ll>,ll> getCost(ll v){ //p1,p2,h

    if(e[v].size()==0) return make_tuple(multiset<ll>({0,0}),0);
    //ll slope = 0;
   // vector<pii> events;

	multiset<ll> allPoints;

    vector<tuple<multiset<ll>,ll> > allChildcosts;

    ll slope = 0;
    ll costAllZero = 0;

    rep(i,0,e[v].size()){
		multiset<ll> points;
		ll costZero;
        tie(points,costZero) = getCost(e[v][i].first);
        ll l1 = *prev(points.end());
        ll l2 = *prev(prev(points.end()));
        points.erase(prev(points.end()));
        points.erase(prev(points.end()));

        l1+=e[v][i].second;
        l2+=e[v][i].second;

        points.insert(l1);
        points.insert(l2);

        costZero += e[v][i].second;

        trav(p,points) allPoints.insert(p);

        slope -= points.size()-1;
        costAllZero += costZero;

        /*if(v==1){
			cout<<e[v][i].first<<": "<<endl;
			cout<<"costZero: "<<costZero<<endl;
			trav(p,points){
				cout<<p<<" ";
			}
			cout<<endl;
		}*/

        //allChildcosts.emplace(points,h);
    }
    while(allPoints.size()>-slope+1)
		allPoints.erase(prev(allPoints.end()));


    return make_tuple(allPoints,costAllZero);
}

int main(){
	cin.sync_with_stdio(false);
	ll n,m;
	cin>>n>>m;
    n+=m;
    e.resize(n);
    rep(i,1,n){
        ll a = i;
        ll b,c; cin>>b>>c;
        e[b-1].push_back({a,c});
    }


    multiset<ll> points;
    ll costZero;
    tie(points,costZero) = getCost(0);

    ll last = 0;
    ll ans = 1e18;
    ll cost = costZero;
    ll slope = -(points.size()-1);
    //cout<<"costZero: "<<costZero<<endl;
    trav(p,points){
		//cout<<p<<" ";
        cost += slope*(p-last);
        ans = min(ans,cost);
        slope++;
        last = p;
    }
    //cout<<endl;
    cout<<ans<<endl;
}

Compilation message (stderr)

fireworks.cpp: In function 'std::tuple<std::multiset<long long int, std::less<long long int>, std::allocator<long long int> >, long long int> getCost(ll)':
fireworks.cpp:62:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while(allPoints.size()>-slope+1)
           ~~~~~~~~~~~~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...