Submission #61189

#TimeUsernameProblemLanguageResultExecution timeMemory
61189istleminFireworks (APIO16_fireworks)C++14
55 / 100
2045 ms258332 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; vector<multiset<ll>> ms; tuple<multiset<ll>*,ll> getCost(ll v){ //p1,p2,h if(e[v].size()==0) { ms.push_back(multiset<ll>({0,0})); return make_tuple(&ms[ms.size()-1],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); //cout<<e[v][i].first<<": "<<endl; //cout<<ms[ms.size()-1].size()<<endl; //cout<<points->size()<<endl; 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())); ms.push_back(allPoints); return make_tuple(&ms[ms.size()-1],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:70: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...