hihocoder1479 三等分
地址:http://hihocoder.com/problemset/problem/1479
题目:
三等分
描述
小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等分问题,第一种方法不能。#include <bits/stdc++.h> using namespace std; #define MP make_pair 
 #define PB push_back
 typedef long long LL;
 typedef pair<int,int> PII;
 const double eps=1e-;
 const double pi=acos(-1.0);
 const int K=1e6+;
 const int mod=1e9+; int n,v[],sum[];
 vector<int>mp[];
 map<int,int>hs,fa;
 LL ans;
 void dfs1(int x)
 {
 sum[x]=v[x];
 for(int i=;i<mp[x].size();i++)
 dfs1(mp[x][i]),sum[x]+=sum[mp[x][i]];
 }
 void dfs2(int x,int f)
 {
 if(x!=f&&sum[f]==*sum[x]) ans+=fa[sum[x]*]+hs[sum[x]];
 if(x!=f)fa[sum[x]]++;
 for(int i=;i<mp[x].size();i++)
 {
 int u=mp[x][i];
 dfs2(u,f),hs[sum[u]]++;
 }
 if(x!=f)fa[sum[x]]--;
 }
 int main(void)
 {
 int t;cin>>t;
 while(t--)
 {
 ans=;
 memset(sum,,sizeof(sum));
 hs.clear(),fa.clear();
 memset(mp,,sizeof(mp));
 cin>>n;
 for(int i=,x;i<=n;i++)
 scanf("%d%d",&v[i],&x),mp[x].PB(i);
 dfs1(mp[][]);
 if(sum[mp[][]]%==)
 dfs2(mp[][],mp[][]);
 cout<<ans<<endl;
 }
 return ;
 }
 /*
 123
 13
 0 0
 -1 1
 1 2
 -1 3
 1 4
 -1 5
 1 6
 -1 1
 1 8
 -1 9
 1 10
 -1 11
 1 12
 7
 0 0
 0 1
 0 2
 0 3
 0 1
 0 5
 0 6
 5
 0 0
 0 1
 0 1
 0 1
 0 1
 9
 0 0
 0 1
 0 2
 0 1
 0 4
 0 1
 0 6
 0 1
 0 8
 */
hihocoder1479 三等分的更多相关文章
- ios用xib实现三等分以及多等分思路
		Auto Layout 的本质原理 Auto Layout 的本质是用一些约束条件对元素进行约束,从而让他们显示在我们想让他们显示的地方. 约束主要分为以下几种(欢迎补充): 相对于父 view 的约 ... 
- #1479 : 三等分(树形DP)
		http://hihocoder.com/problemset/problem/1479 #1479 : 三等分 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最 ... 
- css等比例分割父级容器(完美三等分)
		html部分代码: 方法一: 浮动布局+百分比 (将子元素依次左浮动,根据子元素的个数,设定每个子元素的宽度百分比) 方法二:行内元素(inline-block)+百分比 方法三: 父元素 disp ... 
- Hihocoder #1479 : 三等分   树形DP
		三等分 描述 小Hi最近参加了一场比赛,这场比赛中小Hi被要求将一棵树拆成3份,使得每一份中所有节点的权值和相等. 比赛结束后,小Hi发现虽然大家得到的树几乎一模一样,但是每个人的方法都有所不同.于 ... 
- canvas绘制三等分饼型图
		<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- [Swift]LeetCode927. 三等分 | Three Equal Parts
		Given an array A of 0s and 1s, divide the array into 3 non-empty parts such that all of these parts ... 
- bash编程 将一个目录里所有文件存为一个array 并分割为三等分——利用bash array切片
		files=(a b c d e f g h i j k l m n o p)cnt="${#files[@]}"let cnt1="($cnt+2)/3"le ... 
- 【[Offer收割]编程练习赛9 C】三等分
		[题目链接]:http://hihocoder.com/problemset/problem/1479 [题意] . [题解] 首先算出所有节点的权值的和val; 然后如果val%3!=0则直接输出0 ... 
- 【css3笔记】---- 渐变的秘密
		<CSS揭秘>这本书非常不错,充满了干货和惊喜.以下主要是关于使用渐变做出来的一些效果的笔记.请用最新的现代浏览器观看. 首先要回顾下一个css语句: linear-gradient([ ... 
随机推荐
- hdu 2141:Can you find it?(数据结构,二分查找)
			Can you find it? Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others ... 
- WebGL中的OpenGL着色器语言
			在webgl中,调用了OpenGL-ES-2.0的API,而在OpenGL-ES专为嵌入式设备设计,其和其它设备一样,都是使用GLSL(GL Shading Language)来编写片段程序并执行于G ... 
- mysql触发器小实验
			今天实验了一下mysql的触发器 mysql> use test; Database changed mysql> desc time; +-------+---------------- ... 
- ios开发之 --调用系统的页面,显示中文
			在开发的过程中,我们会接入很多的sdk,比如相机,相册,是否允许获取位置等,大多数的情况下是默认显示英文, 在plist文件里面添加一个key就可以了,如下图: key:Localization na ... 
- deviceready has not fired after 5 seconds
			deviceready has not fired after 5 seconds 建议用手机连上电脑,用真机进行调试: 
- mybatis设置数据库连接的密码不需要加密
			mybatis设置数据库连接的密码不需要加密:在数据库连接配置处加上:<property name="connectionProperties" value="co ... 
- HDU 4417  Super Mario(线段树)
			Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ... 
- googlr   黄金法则  监控
			googlr 黄金法则 监控 
- Python 之网络编程
			# 流程描述: # # 1. 服务器根据地址类型(ipv4, ipv6), socket类型, 协议创建socket; # # 2. 服务器为socket绑定ip地址和端口号; # # 3. 服务器s ... 
- intel EPT 机制详解
			2016-11-08 在虚拟化环境下,intel CPU在处理器级别加入了对内存虚拟化的支持.即扩展页表EPT,而AMD也有类似的成为NPT.在此之前,内存虚拟化使用的一个重要技术为影子页表. 背景: ... 
