Submission #793373

#TimeUsernameProblemLanguageResultExecution timeMemory
793373ToniBFireworks (APIO16_fireworks)C++17
26 / 100
104 ms7328 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll inf = 2e14; const int MAXN = 5005; int n, m; vector<pair<int, int> > adj[MAXN]; ll 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); ll ans = dp[0][0]; for(int i = 1; i < (int)walk.size(); ++i) ans = min(ans, dp[0][i]); cout << ans; 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...