地址:http://hihocoder.com/problemset/problem/1479

题目:

三等分

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi最近参加了一场比赛,这场比赛中小Hi被要求将一棵树拆成3份,使得每一份中所有节点的权值和相等。

比赛结束后,小Hi发现虽然大家得到的树几乎一模一样,但是每个人的方法都有所不同。于是小Hi希望知道,对于一棵给定的有根树,在选取其中2个非根节点并将它们与它们的父亲节点分开后,所形成的三棵子树的节点权值之和能够两两相等的方案有多少种。

两种方案被看做不同的方案,当且仅当形成方案的2个节点不完全相同。

输入

每个输入文件包含多组输入,在输入的第一行为一个整数T,表示数据的组数。

每组输入的第一行为一个整数N,表示给出的这棵树的节点数。

接下来N行,依次描述结点1~N,其中第i行为两个整数Vi和Pi,分别描述这个节点的权值和其父亲节点的编号。

父亲节点编号为0的节点为这棵树的根节点。

对于30%的数据,满足3<=N<=100

对于100%的数据,满足3<=N<=100000, |Vi|<=100, T<=10

输出

对于每组输入,输出一行Ans,表示方案的数量。

样例输入
2
3
1 0
1 1
1 2
4
1 0
1 1
1 2
1 3
样例输出
1
0思路:哈希+dfs两遍dfs,第一遍求出到该点的权值和(sum[x]:权值和),第二遍时计算答案ans。因为只有三等分,其中一个点已经规定了是根节点,所以只需考虑剩下两个点(选作根)的情况:1.两个点是祖先关系,两点在同一条链上。2.两点不在同一条链上。对于这两种情况,我们可以两个哈希来解决对于第一种情况:维护一个map<int,int>fa的哈希,该哈希记录的是到节点x的所有祖先节点的权值和,则可以三等分时有sum[root]==3*sum[x]?ans+=fa[2*sum[x]]:0;对于第二种情况:同样是维护一个哈希map<int,int>hs,该哈希记录的是除节点的x的祖先节点外已dfs过的节点的权值和,则可以三等分时有sum[root]==3*sum[x]?ans+=hs[sum[x]]:0;综上:if(sum[root]==3*sum[x])  ans+=fa[2*sum[x]]+hs[sum[x]];

另外一种做法,dp!dp[x][i]:表示到节点x时,合法的i等分的情况有多少种。然后考虑下子树合并时的情况就好了。这种方法可以解决n等分问题,第一种方法不能。
 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define MP make_pair
 6 #define PB push_back
 7 typedef long long LL;
 8 typedef pair<int,int> PII;
 9 const double eps=1e-8;
10 const double pi=acos(-1.0);
11 const int K=1e6+7;
12 const int mod=1e9+7;
13
14 int n,v[100005],sum[100005];
15 vector<int>mp[100005];
16 map<int,int>hs,fa;
17 LL ans;
18 void dfs1(int x)
19 {
20     sum[x]=v[x];
21     for(int i=0;i<mp[x].size();i++)
22         dfs1(mp[x][i]),sum[x]+=sum[mp[x][i]];
23 }
24 void dfs2(int x,int f)
25 {
26     if(x!=f&&sum[f]==3*sum[x])    ans+=fa[sum[x]*2]+hs[sum[x]];
27     if(x!=f)fa[sum[x]]++;
28     for(int i=0;i<mp[x].size();i++)
29     {
30         int u=mp[x][i];
31         dfs2(u,f),hs[sum[u]]++;
32     }
33     if(x!=f)fa[sum[x]]--;
34 }
35 int main(void)
36 {
37     int t;cin>>t;
38     while(t--)
39     {
40         ans=0;
41         memset(sum,0,sizeof(sum));
42         hs.clear(),fa.clear();
43         memset(mp,0,sizeof(mp));
44         cin>>n;
45         for(int i=1,x;i<=n;i++)
46             scanf("%d%d",&v[i],&x),mp[x].PB(i);
47         dfs1(mp[0][0]);
48         if(sum[mp[0][0]]%3==0)
49             dfs2(mp[0][0],mp[0][0]);
50         cout<<ans<<endl;
51     }
52     return 0;
53 }
54 /*
55 123
56 13
57 0 0
58 -1 1
59 1 2
60 -1 3
61 1 4
62 -1 5
63 1 6
64 -1 1
65 1 8
66 -1 9
67 1 10
68 -1 11
69 1 12
70 7
71 0 0
72 0 1
73 0 2
74 0 3
75 0 1
76 0 5
77 0 6
78 5
79 0 0
80 0 1
81 0 1
82 0 1
83 0 1
84 9
85 0 0
86 0 1
87 0 2
88 0 1
89 0 4
90 0 1
91 0 6
92 0 1
93 0 8
94 */

 

转载于:https://www.cnblogs.com/weeping/p/6541520.html

hihocoder1479 三等分相关推荐

  1. 欧几里得的尺规(三等分一个线段)

    三等分一个线段(tripartition(AB)) 输入:线段 AB 输出:将 AB 等分的两个点,H.G 从 B 发出一条(任意一条)与 AB 不重合的射线 BC 任取 BC 上三点 D.E.F,使 ...

  2. 数学老师用数学课件制作工具快速三等分线段

    中学时代,在学习几何知识时,很多情况下需要等分图形.看似简单的等分图形,如果手动等分则有失图形的准确性,所以可以借助辅助工具.以线段为例,介绍如何快速准确地三等分线段? 几何画板是数学老师必备的教学辅 ...

  3. 【927. 三等分】

    来源:力扣(LeetCode) 描述: 给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分 ,使得所有这些部分表示相同的二进制值. 如果可以做到,请返回任何 [i, j],其中 ...

  4. IOS xib三等分,四等分控件

    三等分思路: 1,先设置好第一个左上约束,和第一个高度. 2,设置中间第二个左约束,等高,中心对齐 3,设置第三个右约束,等高,中心对其 4,全选3个,等宽.即可. 四等分同理

  5. uva 11178 Morley's Theorem 三角形内角三等分线交点

    给出一个三角形ABC的三个顶点坐标,共有6条内角三等分线:AF .AE. BF. BD. CE. CD,求点D.E.F的坐 标. #include<cstdio> #include< ...

  6. LeetCode每日一题:927. 三等分 (困难) 数组 数学

    题目:力扣 给定一个由 0 和 1 组成的数组 arr ,将数组分成  3 个非空的部分 ,使得所有这些部分表示相同的二进制值. 如果可以做到,请返回任何 [i, j],其中 i+1 < j,这 ...

  7. LeetCode每日一题——927. 三等分

    LeetCode每日一题系列 题目:927. 三等分 难度:困难 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个 ...

  8. Hihocoder #1479 : 三等分 树形DP

    三等分  描述 小Hi最近参加了一场比赛,这场比赛中小Hi被要求将一棵树拆成3份,使得每一份中所有节点的权值和相等. 比赛结束后,小Hi发现虽然大家得到的树几乎一模一样,但是每个人的方法都有所不同.于 ...

  9. 分割数组(将数组三等分)

    简单面试题--分割数组 时间复杂度O(n) //输入:一个自然数数组,选取其中2个数字num[i], num[j], 把数组三分, // 每一部分的累加和(不包括分割点的数字)相等. // 例:num ...

最新文章

  1. 听说微软出了个 Windows XP reStart Edition? 重启版?
  2. Symfony2Book06:路由
  3. selenium python (八)定位frame中的对象
  4. Spring获取属性配置
  5. sum 去重_Excel函数,用到什么学什么!多条件求和神器之SUMIFS和去重
  6. linux ip端口配置文件,Linux /etc/network/interfaces配置接口方法
  7. 常用工具类系列之DateUtil
  8. [Oracle整理]CASE-END
  9. OPPO Reno 3 Pro细节流出:同价位最轻薄的双模5G手机
  10. OpenCV入门知识[转载]
  11. LOVE2D android竖屏的问题
  12. 来料加工企业使用ERP系统作用有哪些
  13. 明翰英语教学系列之雅思口语篇V0.2(持续更新)
  14. 通道和色彩调整——冷色调图片
  15. python中天天向上的力量实例
  16. Windows10 U盘无法格式化怎么办?U盘拒绝访问?
  17. 远程连接内网路由器下的电脑
  18. 查看电脑配置命令_注册表
  19. java学习书籍推荐
  20. Visual Studio滚动条设置

热门文章

  1. 5G通信算什么,印度政府计划3年内全国通网,未来进军太空通信
  2. 2021广东省高考成绩查询时间,广东省高考成绩查询时间及方式公布
  3. 配置思路ensp_配置OSPF的Stub区域示例
  4. 014_SpringBoot视图层技术thymeleaf-访问域对象
  5. android 模拟飞行,安卓版模拟飞行 X Plane 9试玩
  6. eclipse连接mysql8报错_Eclipse连接MySQL8.0.13 win10 64位
  7. mysql 录入窗体设计_在Access中,可用于设计输入界面的对象是   A)窗体 B)报表 C)查询 D)表...
  8. c json 数组转dirction_值得掌握的命令行JSON工具jq
  9. 华为eNSP安装使用教程 故障解决
  10. ios12关闭设置角标_iOS 12.4 正式推送,一键换机功能上线!