Codeforces Round #398 (Div. 2) C. Garland(树上操作+dfs)

题目链接
在这里插入图片描述
在这里插入图片描述
思路:我们先深搜,有底向上回溯的过程中记录子树和等于sum/3的点就可以了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+1;
vector<int>g[maxn];
int n,num[maxn],root,x=-1,y=-1;
ll sum=0,t,cnt[maxn];
void dfs(int u,int fa,ll t)
{
	cnt[u]=num[u];
	for(int to:g[u])
	{
		if(to==fa) continue;
		dfs(to,u,t);
		if(cnt[to]==t&&y==-1) y=to;
		else cnt[u]+=cnt[to];
	}
	if(y!=-1&&cnt[u]==t&&u!=root) x=u;
}
int main()
{
	scanf("%d",&n);
	for(int i=1,u,v;i<=n;++i)
	{
		scanf("%d%d",&u,&v);
		if(u!=0)
		{
		g[u].push_back(i);
		g[i].push_back(u);
		}
		else root=i;
		num[i]=v;
		sum+=v;
	}
	if(sum%3!=0){
		printf("-1\n");return 0;
	}
	ll t=sum/3;
	dfs(root,0,t);
	if(x!=-1) printf("%d %d\n",x,y);
	else printf("-1\n");
}
发布了171 篇原创文章 · 获赞 0 · 访问量 5793

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104640361