Submission #1248568

#TimeUsernameProblemLanguageResultExecution timeMemory
1248568qwerasdfzxclTree (IOI24_tree)C++20
0 / 100
2095 ms40060 KiB
#include "tree.h" #include <bits/stdc++.h> using namespace std; using ll = long long; int n; vector<int> adj[200200]; ll a[200200]; void init(std::vector<int> P, std::vector<int> W) { n = P.size(); for (int i=1;i<n;i++) adj[P[i]+1].push_back(i+1); for (int i=0;i<n;i++) a[i+1] = W[i]; } ll ofs[200200], len[200200]; priority_queue<array<ll, 2>, vector<array<ll, 2>>, greater<>> dp[200200]; void merge(int s, int v){ ofs[s] += ofs[v]; len[s] += len[v]; if (dp[s].size() < dp[v].size()) swap(dp[s], dp[v]); while(!dp[v].empty()){ auto p = dp[v].top(); dp[v].pop(); dp[s].push(p); } } void dfs(int s, int L, int R){ while(!dp[s].empty()) dp[s].pop(); ofs[s] = 0; len[s] = 0; if (adj[s].empty()){ ofs[s] = a[s] * L; return; } for (auto &v:adj[s]){ dfs(v, L, R); merge(s, v); } int d = adj[s].size(); ofs[s] += a[s] * L * (d - 1); ofs[s] -= a[s] * (R-L); len[s] += R-L; dp[s].push({a[s], R-L}); while(len[s] > R-L){ auto [dy, cnt] = dp[s].top(); dp[s].pop(); ofs[s] += dy * cnt; len[s] -= cnt; if (len[s] >= R-L) continue; ofs[s] -= dy * ((R-L) - len[s]); len[s] = R-L; dp[s].push({dy, (R-L) - len[s]}); break; } } long long query(int L, int R) { dfs(1, L, R); return ofs[1]; }
#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...