제출 #1149206

#제출 시각아이디문제언어결과실행 시간메모리
1149206Ludissey트리 (IOI24_tree)C++20
0 / 100
2091 ms48336 KiB
#include "tree.h" #include <bits/stdc++.h> #define sz(a) (int)a.size() #define int long long #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() using namespace std; int n; vector<signed> p; vector<int> w; vector<vector<int>> child; int sum=0; void init(std::vector<signed> P, std::vector<signed> W) { p=P; n = (int)p.size(); w.resize(n); for (int i = 0; i < n; i++) { w[i]=W[i]; } child.resize(n); for (int i = 1; i < n; i++) { child[p[i]].push_back(i); } } pair<int,vector<pair<int,int>>> dfs(int x, int l, int r){ if(sz(child[x])==0){ sum+=l*w[x]; return {l,{{w[x],l}}}; } vector<pair<int,int>> tot; int sm=0; for (auto u : child[x]) { pair<int,vector<pair<int,int>>> d=dfs(u,l,r); vector<pair<int,int>> cu=d.second; sm+=d.first; for (int i = 0; i < sz(cu); i++) tot.push_back(cu[i]); } sort(all(tot)); for (int i = 0; i < sz(tot); i++) { if(tot[i].first>=w[x]){ int mn=max(0LL,sm-r); sm-=mn; sum+=mn*w[x]; break; } int mn=max(0LL,min(tot[i].second-l,sm-r)); sm-=mn; tot[i].second-=mn; sum+=mn*tot[i].first; } if(sm>0){ int mn=max(0LL,sm-r); sm-=mn; sum+=mn*w[x]; } tot.push_back({w[x],sm}); return {sm,tot}; } long long query(signed L, signed R) { sum=0; dfs(0,L,R); return sum; }
#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...