HDU 4705 Y
Y
Total Submission(s): 433 Accepted Submission(s): 147

1 2
1 3
1 4
1. The only set is {2,3,4}.
2. Please use #pragma comment(linker, "/STACK:16777216")
比赛最后的时候才有的思路,当时有些细节没有想清楚,也没有急着写,赛后写了一下,结果各种错误,除了addeage()函数我没有改过外,其他的几乎都改过,害我查错查到现在。
有些dp的味道
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <cmath>
#define N 100010
#pragma comment(linker, "/STACK:16777216")
__int64 two[N];
__int64 sum[N];
bool status[N];
int level[N];
struct num
{
int e,next;
}a[2*N];
int b[N],Top;
int main()
{
//freopen("data.in","r",stdin);
void addeage(int x,int y);
__int64 pre_deal(int k);
__int64 deal(int k);
__int64 get_two(int k);
int n;
while(scanf("%d",&n)!=EOF)
{
Top=0;
memset(b,-1,sizeof(b));
for(int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d %d",&x,&y);
addeage(x,y);
addeage(y,x);
}
memset(sum,0,sizeof(sum));
memset(status,false,sizeof(status));
memset(level,0,sizeof(level));
pre_deal(1);
memset(two,0,sizeof(two));
get_two(1);
memset(status,false,sizeof(status));
__int64 res=deal(1);
printf("%I64d\n",res);
}
return 0;
}
void addeage(int x,int y)
{
a[Top].e = y;
a[Top].next = b[x];
b[x]=Top++;
}
__int64 pre_deal(int k)
{
status[k]=true;
for(int i=b[k];i!=-1;i=a[i].next)
{
int x = a[i].e;
if(!status[x])
{
level[x]=level[k]+1;
sum[k]+=pre_deal(x);
}
}
sum[k]+=1;
return sum[k];
}
__int64 get_two(int k)
{
__int64 s1;
bool check=true;
for(int i=b[k];i!=-1;i=a[i].next)
{
int y = a[i].e;
if(level[y]!=level[k]+1)
{
continue;
}
if(check)
{
s1=sum[y];
check=false;
continue;
}
two[k]+=(s1*sum[y]);
s1+=sum[y];
}
for(int i=b[k];i!=-1;i=a[i].next)
{
int y = a[i].e;
if(level[y]!=level[k]+1)
{
continue;
}
two[k]+=get_two(y);
}
return two[k];
}
__int64 deal(int k)
{
status[k]=true;
__int64 s = 0;
__int64 x2,three=0,s1,temp=0;
int uv=0;
bool check=true;
for(int i=b[k];i!=-1;i=a[i].next)
{
int y = a[i].e;
if(level[y]!=level[k]+1)
{
continue;
}
if(uv==0)
{
s1=sum[y];
uv++;
continue;
}
if(check)
{
temp+=(s1*sum[y]);
s1+=sum[y];
check=false;
continue;
}
three+=(temp*sum[y]);
temp+=(s1*sum[y]);
s1+=sum[y];
}
s+=three;
__int64 w=0;
for(int i=b[k];i!=-1;i=a[i].next)
{
if(!status[a[i].e])
{
s+=deal(a[i].e);
w+=(sum[a[i].e]);
s+=two[a[i].e];
}
}
__int64 ans=0;
for(int i=b[k];i!=-1;i=a[i].next)
{
int y =a[i].e;
__int64 res=0;
if(level[y]==level[k]+1&&two[y]!=0)
{
res+=((w-sum[y])*two[y]);
}
ans+=res;
}
s+=ans;
return s;
}
HDU 4705 Y的更多相关文章
- HDU 4705 Y (2013多校10,1010题,简单树形DP)
Y Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...
- HDU 4705 Y 树形枚举
树形枚举--搜索 题目描述: 给你一棵树,要在一条简单路径上选3个不同的点构成一个集合,问能构成多少个不同的集合. 解法: 枚举所有结点,假设某个结点有n棵子树,每棵子树的结点个数分别为s1,s2,` ...
- hdu 4705 Y (树形dp)
Description Input 4 1 2 1 3 1 4 题目的意思是给你一棵树,让你找到所有不在一条路径上的三个点的情况个数.乍一看正向处理比较麻烦,我们从反方向考虑,如果是取在一条路径上的3 ...
- hdu 4705 dfs统计更新节点信息
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 #pragma comment(linker, "/STACK:16777216&qu ...
- HDU 5297 Y sequence 容斥 迭代
Y sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Description Yellowstar likes integer ...
- hdu 4705(树形DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 思路:反面考虑,用总的方案数减去A,B,C三点在同一路径上的方案数.于是我们可以确定中间点B,在 ...
- HDOJ 4705 Y 树形DP
DP:求出3点构成链的方案数 .然后总方案数减去它 Y Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- HDU 5297 Y sequence Y数列
题意:给定正整数n和r.定义Y数列为从正整数序列中删除全部能表示成a^b(2 ≤ b ≤ r)的数后的数列,求Y数列的第n个数是多少. 比如n = 10. r = 3,则Y数列为2 3 5 6 7 1 ...
- hdu 4705 排列组合
思路:枚举能是A,B,C在一条简单路径上的中点. 计算多少个几何能满足.在用总数减去 #pragma comment(linker, "/STACK:16777216") #inc ...
随机推荐
- shell中常用的特殊字符
(1) * 代表0到无穷个任意字符 (2)?代表任意一个字符 (3)代表括号内任意一个字符 (4)[ - ] 代表一个范围中的任意一个字符 如[0-9] 即是代表0-9之间的一个数 (5)[^] 反向 ...
- AXIS2远程调用WebService示例(Eclipse+AXIS)
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/10/3071584.html 我们将Web Service发布在Tomcat或者其他应 ...
- 使用css3和伪元素制作的一个立体导航条
使用css3和伪元素制作的一个立体导航条供大家参考,代码如下: <!doctype html> <html lang="en"> <head> ...
- codevs 1455 路径 计算m^n%p
题目链接 题目描述 Description 小明从A1到An+1,他知道从A1到A2,从A2到A3,......,从An到An+1都有m条路,且从A1到An+1都只有这些路.小明想知道,从A1地到An ...
- poj 3592 Instantaneous Transference 缩点+最长路
题目链接 给一个n*m的图, 从0, 0这个点开始走,只能向右和向下. 图中有的格子有值, 求能获得的最大值. 其中有些格子可以传送到另外的格子, 有些格子不可以走. 将图中的每一个格子都看成一个点, ...
- [LeetCode]题解(python):137-Single Number II
题目来源: https://leetcode.com/problems/single-number-ii/ 题意分析: 给定一个数组,数组里面每一个数字都出现了3次除了一个,找出那个数.要求时间复杂度 ...
- The basic introduction to MIX language and machine
reference: The MIX Computer, The MIX Introduction sets, The basic info storage unit in MIX computer ...
- Cortex-M3动态加载三(模块调用系统函数)
在我的arm动态加载实验中需要解决一个模块调用系统函数的问题,可以使用以下的一个方法.将系统函数固定在某一段地址空间,然后导出这一块的符号表到符号文件中,要记载的模块link的时候使用这个符号表文件, ...
- 认识和理解css布局中的BFC
认识和理解css布局中的BFC BFC的定义 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用. Block Formatting Con ...
- Codeforces 711E ZS and The Birthday Paradox(乘法逆元)
[题目链接] http://codeforces.com/problemset/problem/711/E [题目大意] 假设一年有2^n天,问k个小朋友中有两个小朋友生日相同的概率. 假设该概率约分 ...