前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Codeforces Round 767C 树形结构求子树和

Codeforces Round 767C 树形结构求子树和

作者头像
用户2965768
发布2019-07-11 10:39:08
2690
发布2019-07-11 10:39:08
举报
文章被收录于专栏:wymwym

题意:把一颗树分成3部分,使得每一部分的点权和相等

很容易发现每一颗子树的点权是固定的,因为总和固定,设每一部分的大小为W,那么我们就从下往上更新,遇到等于W的子树就sz重置成0.

代码语言:javascript
复制
//Codeforces Round 767C
//树形结构,算子树总和 
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+6;
struct N{
	int v,nxt,w;
}node[maxn<<2];
int sum,num,cnt,head[maxn<<2]; 
int size[maxn],w[maxn];
int ans[3];
void add(int u,int v)
{
	++cnt;
	node[cnt].v = v;
	node[cnt].nxt= head[u];
	head[u] = cnt;
}
void dfs(int u,int fa){
	size[u] = w[u];
	for(int v,i=head[u];i;i=node[i].nxt){
			v = node[i].v;	
			if(v==fa)continue;
			dfs(v,u);
			size[u]+=size[v];
	}
	if(size[u]==sum)ans[++num]=u,size[u] = 0;
}
int main()
{
	int n,v,root;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d %d",&v,&w[i]);
		sum+=w[i];
		if(v==0){
			root = i; continue;
		}
		add(v,i);	add(i,v);
	}
	if(sum%3!=0){
		printf("-1\n");
	}else{
		sum/=3;
		dfs(root,0);
		if(num<=2){printf("-1\n");return 0;}
		printf("%d %d\n",ans[1],ans[2]);
	}
	
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档