Submission #1003292

#TimeUsernameProblemLanguageResultExecution timeMemory
1003292BF001Beads and wires (APIO14_beads)C++17
0 / 100
3 ms5212 KiB
#include <bits/stdc++.h>
using namespace std;

#define N 200005
#define int long long
#define fi first
#define se second

typedef pair<int, int> ii;

int n, dp[3][N], res = 0, wi[N], mm[N];
vector<ii> adj[N];

bool cmp(int& a, int& b){
	return a > b;
}

void dfs(int u, int p){
	int d1 = 0, d2 = 0, ma = -1e15;
	vector<int> tmp;
	for (auto x : adj[u]){
		int v = x.fi, w = x.se;
		if (v == p) continue;
		dfs(v, u);
		if (dp[0][v] != 0){
			dp[1][u] += max(dp[0][v] + w, dp[1][v]);
		}
		else dp[1][u] += dp[1][v];
		if (dp[0][v] != 0){
			dp[0][u] += dp[0][v] + w;
			ma = max(ma, dp[1][v] - dp[0][v]);
		}
		else ma = max(ma, dp[1][v] + w);
		wi[v] = w;
	}
	dp[0][u] += ma;
	mm[u] = ma;
	//cout << u << " " << dp[0][u] << " " << dp[1][u] << "\n";
}

void ud(int p0, int p1, int v){
	int cst = p1;
	if (p0 != 0) cst = max(cst, p0 + wi[v]);
	dp[1][v]+= cst;
	dp[0][v] -= mm[v];
	if (p0 != 0){
		dp[0][v] += p0 + wi[v];
		mm[v] = max(mm[v], p1 - p0);
	}
	else mm[v] = max(mm[v], p1 + wi[v]);
	dp[0][v] += mm[v];
}

void rr(int u, int p, int p0, int p1){
	res = max(res, dp[1][u]);
	int siz = adj[u].size() - (p != 0);
	vector<int> pre(siz + 2, 0), suf(siz + 2, 0), mpre(siz + 2, 0), msuf(siz + 2, 0);
	mpre[0] = -1e15, msuf[siz + 1] = -1e15;

	if (p != 0){
		if (p0 != 0){
			pre[0] += p0 + wi[u];
			mpre[0] = p1 - p0;
		}
		else mpre[0] = p1 + wi[u];
	}	
	int pos = 0;
	for (auto x : adj[u]){
		int v = x.fi, w = x.se;
		if (v == p) continue;
		pos++;
		pre[pos] = pre[pos - 1];
		mpre[pos] = mpre[pos - 1];
		if (dp[0][v] > 0){
			pre[pos] += dp[0][v] + w;
			mpre[pos] = max(mpre[pos], dp[1][v] - dp[0][v]);
		}
		else mpre[pos] = max(mpre[pos], dp[1][v] + w);
	}

	pos = siz + 1;
	for (int i = adj[u].size() - 1; i >= 0; i--){
		int v = adj[u][i].fi, w = adj[u][i].se;
		if (v == p) continue;
		pos--;
		suf[pos] = suf[pos + 1];
		msuf[pos] = msuf[pos + 1];
		if (dp[0][v] > 0){
			suf[pos] += dp[0][v] + w;
			msuf[pos] = max(msuf[pos], dp[1][v] - dp[0][v]);
		}
		else msuf[pos] = max(msuf[pos], dp[1][v] + w);
	}
	
	pos = 0;

	for (auto x : adj[u]){
		int v = x.fi, w = x.se;
		if (v == p) continue;
		int cst = dp[1][v];
		pos++;
		if (dp[0][v] != 0) cst = max(cst, dp[0][v] + w);
		int p1 = dp[1][u] - cst;
		int p0 = pre[pos - 1] + suf[pos + 1] + max(mpre[pos - 1], msuf[pos + 1]);
		//if (u ==1 && v == 3) cout <<"check : " << pre[pos - 1] << " " << suf[pos + 1] << " " << max(mpre[pos - 1], msuf[pos + 1]) << "\n"; 
		ud(p0, p1, v);
		rr(v, u, p0, p1);
	}

}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
      
    cin >> n;
    for (int i = 1; i <= n - 1; i++){
    	int u, v, w;
    	cin >> u >> v >> w;
    	adj[u].push_back({v, w});
    	adj[v].push_back({u, w});
    }

    int root = 1;
    dfs(root, 0);
    rr(root, 0, 0, 0);
  	
  	cout << res;

    return 0;
}     

Compilation message (stderr)

beads.cpp: In function 'void dfs(long long int, long long int)':
beads.cpp:19:6: warning: unused variable 'd1' [-Wunused-variable]
   19 |  int d1 = 0, d2 = 0, ma = -1e15;
      |      ^~
beads.cpp:19:14: warning: unused variable 'd2' [-Wunused-variable]
   19 |  int d1 = 0, d2 = 0, ma = -1e15;
      |              ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...