제출 #673458

#제출 시각아이디문제언어결과실행 시간메모리
673458S2speedFireworks (APIO16_fireworks)C++17
26 / 100
19 ms2004 KiB
#include<bits/stdc++.h>

using namespace std;

#pragma GCC optimize ("Ofast")

#define all(x) x.begin() , x.end()
#define sze(x) (ll)(x.size())
typedef long long ll;
typedef pair<ll , ll> pll;

const ll maxn = 312 , md = 1e9 + 7 , inf = 2e16;

ll n , m;
vector<ll> v;

void sub1(){
	for(ll i = 0 ; i < m ; i++){
		ll w;
		cin>>w>>w;
		v.push_back(w);
	}
	sort(all(v));
	ll f = v[m / 2] , ans = 0;
	for(ll i = 0 ; i < m ; i++){
		ans += abs(v[i] - f);
	}
	cout<<ans<<'\n';
	return;
}

vector<pll> adj[maxn];
ll dp[maxn][maxn];

void dDFS(ll r){
	if(r >= n){
		dp[r][0] = 0;
		return;
	}
	for(auto p : adj[r]){
		ll i = p.first;
		dDFS(i);
	}
	for(ll j = 0 ; j <= 300 ; j++){
		ll res = 0;
		for(auto p : adj[r]){
			ll i = p.first , w = p.second , h = inf;
			for(ll k = 0 ; k <= j ; k++){
				ll t = j - k;
				h = min(h , dp[i][k] + abs(t - w));
			}
			res += h;
		}
		dp[r][j] = res;
	}
	return;
}

void sub2(){
	memset(dp , 63 , sizeof(dp));
	for(ll i = 1 ; i < n + m ; i++){
		ll p , w;
		cin>>p>>w; p--;
		adj[p].push_back({i , w});
	}
	dDFS(0);
	ll ans = inf;
	for(ll j = 0 ; j <= 300 ; j++){
		ans = min(ans , dp[0][j]);
	}
	cout<<ans<<'\n';
	return;
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	cin>>n>>m;
	if(n == 1){
		sub1();
		return 0;
	}
	sub2();
	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...