Submission #1200723

#TimeUsernameProblemLanguageResultExecution timeMemory
1200723PacybwoahTree (IOI24_tree)C++20
10 / 100
2095 ms28836 KiB
#include "tree.h" #include<iostream> #include<algorithm> #include<utility> #include<map> #include<vector> #include<cmath> #include<cassert> using namespace std; typedef long long ll; namespace{ int n; vector<vector<int>> graph; vector<ll> vec, dp; ll l, r; ll dfs(int node, int parent){ ll ans = 0; for(auto &x: graph[node]){ if(x == parent) continue; ans += dfs(x, node); dp[node] += dp[x]; } if(dp[node] < l){ assert((int)graph[node].size() == 1); ans += vec[node] * (l - dp[node]); dp[node] = l; } else if(dp[node] > r){ ans += vec[node] * (dp[node] - r); dp[node] = r; } return ans; } } void init(std::vector<int> P, std::vector<int> W) { n = (int)P.size(); graph.resize(n + 1); vec.resize(n + 1); dp.resize(n + 1); for(int i = 1; i < n; i++){ graph[i + 1].push_back(P[i] + 1); graph[P[i] + 1].push_back(i + 1); } for(int i = 1; i <= n; i++) vec[i] = W[i - 1]; } long long query(int L, int R) { l = L; r = R; fill(dp.begin(), dp.end(), 0); return dfs(1, 0); }
#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...