Submission #793376

#TimeUsernameProblemLanguageResultExecution timeMemory
793376ToniBFireworks (APIO16_fireworks)C++17
0 / 100
2 ms964 KiB
#include <bits/stdc++.h> using namespace std; typedef __int128 ll; const ll inf = 1e18; const int MAXN = 5005; int n, m; vector<pair<int, int> > adj[MAXN]; __int128 val[MAXN], dp[MAXN][MAXN]; vector<ll> walk; void precalc(int node){ for(pair<int, int> x : adj[node]){ val[x.first] = val[node] + x.second; precalc(x.first); } walk.push_back(val[node]); walk.push_back(val[node] - 1); walk.push_back(val[node] + 1); } void dfs(int node){ if(node >= n){ for(int i = 0; i < (int)walk.size(); ++i){ if(val[node] == walk[i]) dp[node][i] = 0; else dp[node][i] = inf; } } for(pair<int, int> x : adj[node]){ dfs(x.first); multiset<ll> lo, hi; vector<ll> uk ((int)walk.size()); for(int i = 0; i < (int)walk.size(); ++i){ lo.insert(dp[x.first][i] - walk[i]); uk[i] = walk[i] + *lo.begin(); } int p = (int)walk.size() - 1; for(int i = (int)walk.size() - 1; i >= 0; --i){ hi.insert(dp[x.first][i] + walk[i]); while(p > i && x.second + walk[i] - walk[p] < 0){ assert(hi.find(dp[x.first][p] + walk[p]) != hi.end()); hi.erase(hi.find(dp[x.first][p] + walk[p])); --p; } uk[i] = min(uk[i], *hi.begin() - walk[i]); } for(int i = 0; i < (int)walk.size(); ++i){ dp[node][i] += uk[i]; } } } int main(){ cin >> n >> m; for(int i = 1; i < n + m; ++i){ int p, c; cin >> p >> c, --p; adj[p].push_back({i, c}); } precalc(0); sort(walk.begin(), walk.end()); walk.erase(unique(walk.begin(), walk.end()), walk.end()); dfs(0); __int128 ans = dp[0][0]; for(int i = 1; i < (int)walk.size(); ++i) ans = min(ans, dp[0][i]); vector<int> vans; while(ans){ vans.push_back(ans % 10LL); ans /= 10LL; } reverse(vans.begin(), vans.end()); for(int x : vans) cout << x; return 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...