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 ...
随机推荐
- CloseHandle(),TerminateThread(),ExitThread()的区别
线程的handle用处:线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问.该内存块是一种数据结构,它的成员负责维护对象的各种信 ...
- windows8 安装IIS 和 添加网站(转)
Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是Windows NT版本的可选 ...
- Oracle游标使用详解
转自:http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html 声明游标:CURSOR cursor_name IS select_st ...
- springmvc结合freemarker,非自定义标签
参考:http://viralpatel.net/blogs/spring-mvc-freemarker-ftl-example/ 上图: 目录层级: 启动后的访问地址:http://localhos ...
- 使用SWFUpload插件上传文件
演示代码由两部分组成,包括前台文件和后台文件: 1.前台文件index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi ...
- python 程序中设置环境变量
python 中调用系统命令有三种方法: 1.os.system('command') ,这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 ...
- 字符串-06. IP地址转换
/* * Main.c * D6-字符串-06. IP地址转换 * Created on: 2014年8月19日 *******测试通过******** *转载:http://blog.csdn.ne ...
- 将四个BYTE数值转换成IEEE754标准的浮点数(两种方法:用Addr函数取字节数字的首地址,或者用Absolute关键字)
在工作中,经常使用到IEEE754格式的数据.IEEE754格式的数据占四个字节,好像Motorola格式和Intel格式的还不一样. 由于工作中很少和他打交道(使用的软件内部已经处理),就没太在意. ...
- java selenium webdriver实战 页面元素定位
自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...
- mysql远程登录权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION; FLUSH PRIVILEGES;