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. CloseHandle(),TerminateThread(),ExitThread()的区别

    线程的handle用处:线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问.该内存块是一种数据结构,它的成员负责维护对象的各种信 ...

  2. windows8 安装IIS 和 添加网站(转)

    Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是Windows NT版本的可选 ...

  3. Oracle游标使用详解

    转自:http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html 声明游标:CURSOR cursor_name IS select_st ...

  4. springmvc结合freemarker,非自定义标签

    参考:http://viralpatel.net/blogs/spring-mvc-freemarker-ftl-example/ 上图: 目录层级: 启动后的访问地址:http://localhos ...

  5. 使用SWFUpload插件上传文件

    演示代码由两部分组成,包括前台文件和后台文件: 1.前台文件index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi ...

  6. python 程序中设置环境变量

    python 中调用系统命令有三种方法: 1.os.system('command') ,这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 ...

  7. 字符串-06. IP地址转换

    /* * Main.c * D6-字符串-06. IP地址转换 * Created on: 2014年8月19日 *******测试通过******** *转载:http://blog.csdn.ne ...

  8. 将四个BYTE数值转换成IEEE754标准的浮点数(两种方法:用Addr函数取字节数字的首地址,或者用Absolute关键字)

    在工作中,经常使用到IEEE754格式的数据.IEEE754格式的数据占四个字节,好像Motorola格式和Intel格式的还不一样. 由于工作中很少和他打交道(使用的软件内部已经处理),就没太在意. ...

  9. java selenium webdriver实战 页面元素定位

    自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...

  10. mysql远程登录权限

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION; FLUSH PRIVILEGES;