Garland

Garland

https://ac.nowcoder.com/acm/problem/111886

Garland

题目大意

有一颗 个点的数,第 个点的权值为 ,让你剪掉其中两条边,使得最后得到的三个子树的全职和相等

分析

遍历的时候,统计一下子树的权值之和,只要权值之和为总权值的 就可以放到队列里,最后看队列的大小是否大于 ,如果小于 那么显然是无解的情况了,还有如果总权值不是 的倍数,也是无解的
⚠️注意:在输出的时候,只能输出对头,如果不是输出的对头,那么你实际割下来的子树权值之和是有问题的,有兴趣的同学可以自己下来看看

Code

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;

inline int __read()
{
    int x(0), t(1);
    char o (getchar());
    while (o < '0' || o > '9') {
        if (o == '-') t = -1;
        o = getchar();
    }
    for (; o >= '0' && o <= '9'; o = getchar()) {
        x = (x << 1) + (x << 3) + (o ^ 48);
    }
    return x * t;
}

int n, cur, cnt, tar, a, rt, t[maxn], ans[5];
int Head[maxn], Edge[maxn], Next[maxn];

inline void addedge(int u, int v)
{
    Next[++cur] = Head[u];
    Head[u] = cur;
    Edge[cur] = v;
}

inline void dfs(int u, int f) 
{
    for (int i = Head[u]; i; i = Next[i]) {
        int v = Edge[i];
        if (v == f) continue;
        dfs(v, u);
        t[u] += t[v];
    }
    if (t[u] == tar) {
        ans[++cnt] = u;
        t[u] = 0;
    }
}

int main()
{
    n = __read();
    for (int i = 1; i <= n; ++i) {
        a = __read(), tar += t[i] = __read();
        if (a) addedge(a, i);
        else rt = i;
    }
    if (tar % 3) return puts("-1") & 0;
    tar /= 3;
    dfs(rt, 0);
    if (cnt < 3) puts("-1");
    else printf ("%d %d\n", ans[1], ans[2]);
}
有的没的 文章被收录于专栏

RT,有的没的

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-08 17:10
点赞 评论 收藏
分享
07-09 18:33
门头沟学院 Java
这么逆天每年都有人去???&nbsp;填多益网申就是大型的服从性测试
鲁大牛:辅导员在群里发了这个公司我就申了一下。网申居然要写当场开摄像头写两篇不少于三百字的作文。太逆天了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
评论
5
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务