Submission #135164

#TimeUsernameProblemLanguageResultExecution timeMemory
135164rajarshi_basuFireworks (APIO16_fireworks)C++14
100 / 100
784 ms109740 KiB
#include <iostream> #include <vector> #include <set> #include <iomanip> #include <algorithm> #include <functional> #include <stdio.h> #include <cmath> #include <queue> #include <string> #include <map> #include <fstream> #include <complex> #include <random> #include <stack> #include <chrono> #include <set> #define FOR(i,n) for(int i=0;i<n;i++) #define FORE(i,a,b) for(int i=a;i<=b;i++) #define ll long long int #define vi vector<int> #define ii pair<int,int> #define pb push_back #define mp make_pair #define ff first #define il pair<int,ll> #define li pair<ll,int> #define ss second #define pll pair<ll,ll> #define cd complex<double> #define ld long double #define pld pair<ld,ld> #define plli pair<pll,ll> #define vv vector using namespace std; const int MAXN = 3e5 + 10; ll pe[MAXN]; vi g[MAXN]; ll a[MAXN]; ll b[MAXN]; multiset<ll,greater<ll> >* sp[MAXN]; void dfs(int node){ if(g[node].size() == 0){ // this is a leaf node; a[node] = 1; b[node] = -pe[node]; sp[node] = new multiset<ll,greater<ll> >(); sp[node]->insert(pe[node]); sp[node]->insert(pe[node]); }else{ ll mx = 0; int ind = 0; for(auto e : g[node]){ dfs(e); if(sp[e]->size() > mx){ ind = e; mx = sp[e]->size(); } } sp[node] = sp[ind]; for(auto e : g[node]){ a[node] += a[e]; b[node] += b[e]; if(e == ind)continue; for(auto x : *sp[e]){ sp[node]->insert(x); } } while(a[node] > 1){ ll pt = *(sp[node]->begin()); sp[node]->erase(sp[node]->begin()); a[node]--;b[node] += pt; } ll a1 = *(sp[node]->begin());sp[node]->erase(sp[node]->begin()); ll b1 = *(sp[node]->begin());sp[node]->erase(sp[node]->begin()); sp[node]->insert(a1 + pe[node]); sp[node]->insert(b1 + pe[node]); b[node] -= pe[node]; } } int main(){ int n,m; cin >> n >> m; FOR(i,n+m-1){ int a,b; cin >> a >> b; a--; pe[i+1] = b; g[a].pb(i+1); } dfs(0); //FOR(i,n)cout << a[i] << " " << b[i] << endl; while(a[0] > 0){ ll pt = *(sp[0]->begin()); sp[0]->erase(sp[0]->begin()); a[0]--;b[0] += pt; } cout << b[0] << endl; return 0; }

Compilation message (stderr)

fireworks.cpp: In function 'void dfs(int)':
fireworks.cpp:59:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             if(sp[e]->size() > mx){
                ~~~~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...