爆栈求调
查看原帖
爆栈求调
967972
Rindong楼主2024/9/21 12:10

第6个样例, n 是 500000 ,下载下来本地跑也跑不出答案,是需要手写栈吗?我看评论区都没有手写栈,也复制了第一篇的代码在本地跑,一样出不了答案

#include <iostream>
using namespace std;
#define MAX_N 1000005
#define ll long long
int idle = 1;
int head[MAX_N] = { 0 }, nex[MAX_N * 2] = { 0 };
int edge[MAX_N * 2] = { 0 };
void add(int u, int v) {
	nex[idle] = head[u];
	head[u] = idle;
	edge[idle] = v;
	idle++;
}
// 0 下 1 上
ll dp[MAX_N][2] = { 0 };
ll child[MAX_N][2] = { 0 };
void dfs1(int u, int fa) {
	for (int ind = head[u]; ind; ind = nex[ind]) {
		int v = edge[ind];
		if (v == fa) continue;
		dfs1(v, u);
		child[u][0] += child[v][0];
		dp[u][0] += dp[v][0] + child[v][0];
	}
	child[u][0]++;
}
void dfs2(int u, int fa) {
	child[u][1] = child[fa][1] + (child[fa][0] - child[u][0]);
	dp[u][1] = dp[fa][1] + (dp[fa][0] - dp[u][0] - child[u][0]) 
		+ child[fa][1] + (child[fa][0] - child[u][0]);
	for (int ind = head[u]; ind; ind = nex[ind]) {
		int v = edge[ind];
		if (v == fa) continue;
		dfs2(v, u);
	}
}
int main() {
	int n;
	scanf("%d", &n);
	for (int x = 1; x < n; x++) {
		int u, v;
		scanf("%d%d", &u, &v);
		add(u, v), add(v, u);
	}

	dfs1(1, 0);
	for (int ind = head[1]; ind; ind = nex[ind])
		dfs2(edge[ind], 1);
	int mx = 0, ans = 1;
	for (int x = 1; x <= n; x++)
		if (dp[x][0] + dp[x][1] > mx) {
			mx = dp[x][0] + dp[x][1];
			ans = x;
		}
	printf("%d", ans);
	return 0;
}
2024/9/21 12:10
加载中...