Y

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 433    Accepted Submission(s): 147


Problem Description

 
Sample Input
4
1 2
1 3
1 4
 
Sample Output
1

Hint

1. The only set is {2,3,4}.

2. Please use #pragma comment(linker, "/STACK:16777216")

 
Source
 
Recommend
zhuyuanchen520

 

 比赛最后的时候才有的思路,当时有些细节没有想清楚,也没有急着写,赛后写了一下,结果各种错误,除了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的更多相关文章

  1. HDU 4705 Y (2013多校10,1010题,简单树形DP)

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...

  2. HDU 4705 Y 树形枚举

    树形枚举--搜索 题目描述: 给你一棵树,要在一条简单路径上选3个不同的点构成一个集合,问能构成多少个不同的集合. 解法: 枚举所有结点,假设某个结点有n棵子树,每棵子树的结点个数分别为s1,s2,` ...

  3. hdu 4705 Y (树形dp)

    Description Input 4 1 2 1 3 1 4 题目的意思是给你一棵树,让你找到所有不在一条路径上的三个点的情况个数.乍一看正向处理比较麻烦,我们从反方向考虑,如果是取在一条路径上的3 ...

  4. hdu 4705 dfs统计更新节点信息

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 #pragma comment(linker, "/STACK:16777216&qu ...

  5. HDU 5297 Y sequence 容斥 迭代

    Y sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Description Yellowstar likes integer ...

  6. hdu 4705(树形DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 思路:反面考虑,用总的方案数减去A,B,C三点在同一路径上的方案数.于是我们可以确定中间点B,在 ...

  7. HDOJ 4705 Y 树形DP

    DP:求出3点构成链的方案数 .然后总方案数减去它 Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  8. 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 ...

  9. hdu 4705 排列组合

    思路:枚举能是A,B,C在一条简单路径上的中点. 计算多少个几何能满足.在用总数减去 #pragma comment(linker, "/STACK:16777216") #inc ...

随机推荐

  1. Django 探索(一) HelloWorld

    一.Django怎么读 酱狗 二.Django下载 安装 下载地址 安装: tar zxvf Django-1.5.4.tar.gz python setup.py install 三.建立一个Hel ...

  2. R与数据分析旧笔记(六)多元线性分析 下

    逐步回归 向前引入法:从一元回归开始,逐步加快变量,使指标值达到最优为止 向后剔除法:从全变量回归方程开始,逐步删去某个变量,使指标值达到最优为止 逐步筛选法:综合上述两种方法 多元线性回归的核心问题 ...

  3. php知识--递归

    <?php // /* * 遍历输出文件夹中的所有内容 * @param1 string $dir,要遍历的路径 * @param2 int $level = 0,当前的级别 */ functi ...

  4. for循环产生的Cortex-M3汇编代码的一个奇怪现象

    最近比较一下KEIL和IAR两个编译器产生的代码,基于Cortex-M3处理器的,然后发现了一几个奇怪的地方. 很简单的一个C的for循环 void fun_for_add_65535(void) { ...

  5. Dos命令之Netsh

    NetSH (Network Shell) 是windows系统本身提供的功能强大的网络配置命令行工具. 常用命令 1. 导出配置脚本:netsh -c interface ip dump > ...

  6. 解决android TextView多行文本(超过3行)使用ellipsize属性无效问题

    布局文件中的TextView属性 <TextView android:id="@+id/businesscardsingle_content_abstract" androi ...

  7. 注册UBER(优步)司机常见问题,如何注册uber(优步)司机

    如何注册uber(优步)司机,怎么注册UBER(优步)司机 此链接为优步内部人员推荐,优先审核,基本当天就能收到短信,注意上传证件照清晰点. https://uber.avosapps.com/ref ...

  8. 导出csv文件代码示例

    //当数据量达到一定级别后(大概60000以上),excel会溢出,不能全部显示,而新版的csv好像不会出现这个问题.为什么用好像,我也是听别人说,暂时没有去验证. <?php $sql = & ...

  9. uva 10548 - Find the Right Changes(拓展欧几里得)

    题目链接:uva 10548 - Find the Right Changes 题目大意:给定A,B,C,求x,y,使得xA+yB=C,求有多少种解. 解题思路:拓展欧几里得,保证x,y均大于等于0, ...

  10. 七日筑基——C#第一天(下)

    继续C#第一天的内容,昨天我们简单说了一下如何用C#代码来让学生做自我介绍,介绍的格式要求:“我叫威震天,今年20岁,我喜欢踢足球和上网,希望接下来的三年能跟大家一起成长.”威震天介绍完了,继续下一个 ...