Submission #1310059

#TimeUsernameProblemLanguageResultExecution timeMemory
1310059Jawad_Akbar_JJHarbingers (CEOI09_harbingers)C++20
50 / 100
1099 ms36072 KiB
#include <iostream>
#include <vector>

using namespace std;
#define int long long
const int N = 1<<17, inf = 1e9;
vector<pair<int, int>> nei[N];
int Par[N][20], c[N], m[N], cst[N], dp[N], pre[N], sp[N], start[N];

int intersection(int i, int j){
	int k = (c[i] - c[j]) / (m[j] - m[i]);
	if ((c[i] - c[j]) % (m[j] - m[i]) != 0 and c[i] - c[j] > 0)
		k++;
	return k;
}

void dfs(int u, int pr, int id){
	dp[u] = cst[u] + pre[u] * sp[u];
	
	if (id > 0){
		int k = id;
		for (int i=17;i>=0;i--){
			if (Par[k][i] == 0 or start[Par[k][i]] <= sp[u])
				continue;
			k = Par[k][i];
		}
		if (start[k] > sp[u])
			k = Par[k][0];

		dp[u] = min(dp[u], dp[k] + cst[u] + (pre[u] - pre[k]) * sp[u]);

		// cout<<u<<" "<<k<<endl;
	}
	m[u] = inf - pre[u];
	c[u] = dp[u];

	// for (int i=17;i>=0;i--){
	// 	if (Par[id][i] != 0 and intersection(u, Par[id][i]) <= start[Par[id][i]])
	// 		id = Par[Par[id][i]][0];
	// }
	while (id != 0 and intersection(u, id) <= start[id])
		id = Par[id][0];
	if (id)
		start[u] = intersection(u, id);
	Par[u][0] = id;
	for (int i=0;i<17;i++)
		Par[u][i+1] = Par[Par[u][i]][i];

	for (auto [i, w] : nei[u]){
		if (i == pr)
			continue;
		pre[i] = pre[u] + w;
		dfs(i, u, u);
	}
}

signed main(){
	int n;
	cin>>n;

	for (int i=1;i<n;i++){
		int a, b, c;
		cin>>a>>b>>c;
		nei[a].push_back({b, c});
		nei[b].push_back({a, c});
	}

	for (int i=2;i<=n;i++)
		cin>>cst[i]>>sp[i];

	dfs(1, 1, 0);

	for (int i=2;i<=n;i++)
		cout<<dp[i]<<' ';
	cout<<'\n';

	// cout<<Par[4][0]<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...