Submission #106073

#TimeUsernameProblemLanguageResultExecution timeMemory
106073SaboonBeads and wires (APIO14_beads)C++14
0 / 100
16 ms14464 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn = 2e5 + 10;
const int inf = 1e8;

int dp[maxn], pd[maxn], DP[maxn], PD[maxn];
vector<pair<int, int> > t[maxn];
vector<int> parmax[maxn], revmax[maxn];

void DFS(int v, int par = -1, int weight = 0, int ord = 0){
	if (par != -1){
		int pdup = dp[par] + DP[par] - max(dp[v], pd[v] + weight);
		int mx = -inf;
		if (ord)
			mx = max(mx, parmax[par][ord - 1]);
		if (ord != t[par].size() - 1)
			mx = max(mx, revmax[par][ord + 1]);
		DP[v] = max(pdup, pdup + mx + weight);
		PD[v] = pdup + weight;
//		cout << "dfs down -> " << v << " -> " << DP[v] << " " << PD[v] << " pdup : " << pdup << endl;
	}
	for (int i = 0; i < t[v].size(); i++){
		auto edge = t[v][i];
		int u = edge.first, c = edge.second;
		if (u != par){
			parmax[v].push_back(dp[u] + c - max(dp[u], pd[u] + c));
			revmax[v].push_back(dp[u] + c - max(dp[u], pd[u] + c));
		}
		else{
			int pdup = dp[par] + DP[par] - max(dp[v], pd[v] + weight);
			int mx = -inf;
			if (ord)
				mx = max(mx, parmax[par][ord - 1]);
			if (ord != t[par].size() - 1)
				mx = max(mx, revmax[par][ord + 1]);
			DP[v] = max(pdup, pdup + mx + weight);
			parmax[v].push_back(pdup + c - max(pdup, pdup + mx + c));
			revmax[v].push_back(pdup + c - max(pdup, pdup + mx + c));
		}
	}
	for (int i = 1; i < t[v].size(); i++)
		parmax[v][i] = max(parmax[v][i], parmax[v][i - 1]);
	for (int i = t[v].size() - 1; i >= 0; i--)
		revmax[v][i] = max(revmax[v][i], revmax[v][i + 1]);

	for (int i = 0; i < t[v].size(); i++){
		auto edge = t[v][i];
		int u = edge.first, c = edge.second;
		if (u != par)
			DFS(u, v, c, i);
	}
}	

void dfs(int v, int par = -1){
	int mx = -inf;
	dp[v] = 0;
	for (int i = 0; i < t[v].size(); i++){
		auto edge = t[v][i];
		int u = edge.first, c = edge.second;
		if (u != par){
			dfs(u, v);
			dp[v] += max(dp[u], pd[u] + c);
			mx = max(mx, dp[u] + c - max(dp[u], pd[u] + c)); 
		}
	}
	pd[v] = dp[v] + mx;
//	cout << v << " -> " << dp[v] << " " << pd[v] << endl;
}

int main(){
	ios_base::sync_with_stdio (false);
	int n;
	cin >> n;
	for (int i = 1; i <= n - 1; i++){
		int v, u, c;
		cin >> v >> u >> c;
		t[v].push_back({u, c});
		t[u].push_back({v, c});
	}
	dfs(1);
	DFS(1);
	int answer = 0;
	for (int v = 1; v <= n; v++){
		answer = max(answer, dp[v] + DP[v]);
//		cout << "# " << dp[v] << " " << DP[v] << endl;
	}
	cout << answer << endl;
}

Compilation message (stderr)

beads.cpp: In function 'void DFS(int, int, int, int)':
beads.cpp:20:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (ord != t[par].size() - 1)
       ~~~~^~~~~~~~~~~~~~~~~~~~
beads.cpp:26:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < t[v].size(); i++){
                  ~~^~~~~~~~~~~~~
beads.cpp:38:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (ord != t[par].size() - 1)
        ~~~~^~~~~~~~~~~~~~~~~~~~
beads.cpp:45:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 1; i < t[v].size(); i++)
                  ~~^~~~~~~~~~~~~
beads.cpp:50:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < t[v].size(); i++){
                  ~~^~~~~~~~~~~~~
beads.cpp: In function 'void dfs(int, int)':
beads.cpp:61:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < t[v].size(); i++){
                  ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...