제출 #543062

#제출 시각아이디문제언어결과실행 시간메모리
543062amunduzbaevFireworks (APIO16_fireworks)C++17
26 / 100
26 ms1144 KiB
#include "bits/stdc++.h"
using namespace std;

#define ar array
#define int long long
const int N = 305;
const int inf = 1e18;
vector<ar<int, 2>> edges[N];
int dp[N][N];

void dfs(int u){
	for(auto x : edges[u]){
		dfs(x[0]);
		for(int j=0;j<N;j++){
			int pre = dp[u][j]; dp[u][j] = inf;
			for(int l=0;l<=j;l++){
				dp[u][j] = min(dp[u][j], pre + dp[x[0]][l] + abs(j - l - x[1]));
			}
		}
	}
	
	if(edges[u].empty()){
		memset(dp[u], 63, sizeof dp[u]);
		dp[u][0] = 0;
	}
}

signed main(){
	ios::sync_with_stdio(0); cin.tie(0); 

	int n, m; cin>>n>>m;
	for(int i=1;i<n+m;i++){
		int p, c; cin>>p>>c;
		edges[--p].push_back({i, c});
	}
	
	if(n == 1){
		sort(edges[0].begin(), edges[0].end(), [&](auto& a, auto& b){
			return a[1] < b[1];
		});
		
		int C = edges[0][m / 2][1];
		long long res = 0;
		for(auto x : edges[0]) res += abs(C - x[1]);
		cout<<res<<"\n";
		return 0;
	}
	
	dfs(0);
	int i = 1;
	while(i < N && dp[0][i] <= dp[0][i-1]) i++;
	cout<<dp[0][i-1]<<"\n";
	while(i < N && dp[0][i] > dp[0][i-1]) i++;
	assert(i == N);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...