以下の内容はhttps://kmjp.hatenablog.jp/entry/2026/03/30/1000より取得しました。


Codeforces #527: Div3. F. Tree with Maximum Cost

1ミスしたけど1位と上出来の回。
https://codeforces.com/contest/1092/problem/F

問題

木を成す無向グラフが与えられる。
また、各点vには設定値A[v]がある。

どこかの点rを根としたとき、この木のスコアは、各点vの設定値A[v]と(r,v)間の距離の積和とする。
スコアの最大値を求めよ。

解法

全方位木DPで、SubTree内のスコアとA[v]の総和を求めて行くだけ。

int N;
vector<int> E[202020];
ll A[202020];
ll S[202020];
ll SA[202020];


void dfs(int cur,int pre,int d) {;
	S[0]+=A[cur]*d;
	SA[cur]=A[cur];
	FORR(e,E[cur]) if(e!=pre) {
		dfs(e,cur,d+1);
		SA[cur]+=SA[e];
	}
	
}

void dfs2(int cur,int pre) {
	if(pre!=-1) {
		S[cur]=S[pre]+(SA[0]-SA[cur])-SA[cur];
	}
	FORR(e,E[cur]) if(e!=pre) dfs2(e,cur);
}

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	FOR(i,N) cin>>A[i];
	FOR(i,N-1) {
		cin>>x>>y;
		E[x-1].push_back(y-1);
		E[y-1].push_back(x-1);
	}
	dfs(0,-1,0);
	dfs2(0,-1);
	cout<<*max_element(S,S+N)<<endl;
}

まとめ

まだまだこのころは典型だね。




以上の内容はhttps://kmjp.hatenablog.jp/entry/2026/03/30/1000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14