Submission #208150

#TimeUsernameProblemLanguageResultExecution timeMemory
208150junodeveloperMagic Tree (CEOI19_magictree)C++17
100 / 100
157 ms40568 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define sz(x) ((int)x.size()) #define all(x) (x).begin(), (x).end() #define pb push_back #define fi first #define se second #define mset(x,y) memset(x,y,sizeof(x)) #define rep(i,a,b) for(int i(a);i<=(b);i++) #define repr(i,a,b) for(int i(a);i>=(b);i--) using namespace std; #ifdef LOCAL #define dmp(...) _dmp(#__VA_ARGS__, __VA_ARGS__) #else #define dmp(...) (__VA_ARGS__) #endif template<class TH> void _dmp(const char *sdbg, TH h){cout<<sdbg<<"="<<h<<endl;} template<class TH, class... TA> void _dmp(const char *sdbg, TH h, TA...a){ while(*sdbg!=',')cout<<*sdbg++;cout<<"="<<h<<","; _dmp(sdbg+1, a...); } using namespace __gnu_pbds; using ordered_set = tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef vector<int> vi; int n,m,D; vi adj[100010]; pll a[100010]; multimap<ll,ll>* st[100010]; void solve(int u) { for(auto& it:adj[u])solve(it); if(adj[u].empty()) { st[u]=new multimap<ll,ll>(); } else { int mx=0; for(auto& it:adj[u])mx=max(mx,(int)st[it]->size()); for(auto& it:adj[u]) if(st[it]->size()==mx) { st[u]=st[it]; break; } for(auto& it:adj[u]) { if(st[it]==st[u])continue; for(auto& jt:*st[it])st[u]->insert(jt); } } if(a[u].fi!=-1) { auto it=st[u]->lower_bound(a[u].fi+1); ll sum=0; while(it!=st[u]->end()) { ll tmp=it->se; it->se+=sum; sum+=tmp; if(it->se>a[u].se){ it->se-=a[u].se; break; } it=st[u]->erase(it); } st[u]->insert({a[u].fi,a[u].se}); } } void MAIN() { cin>>n>>m>>D; rep(i,1,n) { adj[i].clear(); a[i]={-1,-1}; } rep(i,2,n) { int p; cin>>p; adj[p].pb(i); } rep(i,1,m) { int v,d,w; cin>>v>>d>>w; a[v]={d,w}; } solve(1); ll ans=0; for(auto& it:*st[1])ans+=it.se; cout<<ans; } int main() { ios::sync_with_stdio(false);cin.tie(0); int T=1; for(int tt=1;tt<=T;tt++) { MAIN(); } return 0; }

Compilation message (stderr)

magictree.cpp: In function 'void _dmp(const char*, TH, TA ...)':
magictree.cpp:20:1: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
 while(*sdbg!=',')cout<<*sdbg++;cout<<"="<<h<<","; _dmp(sdbg+1, a...);
 ^~~~~
magictree.cpp:20:32: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
 while(*sdbg!=',')cout<<*sdbg++;cout<<"="<<h<<","; _dmp(sdbg+1, a...);
                                ^~~~
magictree.cpp: In function 'void solve(int)':
magictree.cpp:41:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if(st[it]->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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...