제출 #1149197

#제출 시각아이디문제언어결과실행 시간메모리
1149197Ludissey트리 (IOI24_tree)C++20
0 / 100
2096 ms35688 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, w; vector<vector<int>> child; int sum=0; void init(std::vector<signed> P, std::vector<signed> W) { p = P; w = W; n = (int)p.size(); child.resize(n); for (int i = 1; i < n; i++) { child[p[i]].push_back(i); } } vector<pair<int,int>> dfs(int x, int l, int r){ if(sz(child[x])==0){ sum+=l*w[x]; return {{w[x],l}}; } vector<pair<int,int>> tot; for (auto u : child[x]) { vector<pair<int,int>> cu=dfs(u,l,r); for (int i = 0; i < sz(cu); i++) tot.push_back(cu[i]); } int sm=0; for (int i = 0; i < sz(tot); i++) sm+=tot[i].second; 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; } tot.push_back({w[x],sm}); return 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...