题目描述 Description
 给一棵N个节点的无根树,求路径长度=K的简单路径数
输入描述 Input Description

第一行两个正整数N,K

接下来N-1行,每行两个正整数x,y,表示一条边(x,y)

输出描述 Output Description
一行一个整数,答案
样例输入 Sample Input
4 2
1 2
2 3
2 4
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
对于30% 2<=K,N<=1000

对于100%,2<=K,N<=10^5

还是一道点分治的题,和POJ1741唯一的区别就是一个是找路径<=k的,一个是找等于k的。两个算法唯一的区别就是在处理dis数组的区别。对于在一个有序表中O(n)的求数对满足两个数的和等于K,我想不到什么比较好的方法,所以导致处理算ans时写的比较丑。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long LL;
#define Pi acos(-1.0)
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}
return x*f;
}
const int maxn=;
struct Edge
{
int u,v,next;
Edge() {}
Edge(int _1,int _2,int _3) : u(_1),v(_2),next(_3) {}
}e[*maxn];
int first[maxn],n,k,a,b,size[maxn],masize[maxn],now_size,root,dis[maxn],end;
bool vis[maxn];
LL ans;
void addEdge(int i,int a,int b)
{
e[i]=Edge(a,b,first[a]);
first[a]=i;
}
void gets(int u,int pa)
{
size[u]=;
masize[u]=;
for(int i=first[u];i!=-;i=e[i].next)
if(!vis[e[i].v] && e[i].v!=pa)
{
gets(e[i].v,u);
size[u]+=size[e[i].v];
masize[u]=max(size[e[i].v],masize[u]);
}
}
void getr(int r,int u,int pa)
{
masize[u]=max(masize[u],size[r]-size[u]);
if(masize[u]<now_size)now_size=masize[u],root=u;
for(int i=first[u];i!=-;i=e[i].next)
if(!vis[e[i].v] && e[i].v!=pa)getr(r,e[i].v,u);
}
void getd(int u,int pa,int d)
{
dis[end++]=d;
for(int i=first[u];i!=-;i=e[i].next)
if(!vis[e[i].v] && e[i].v!=pa)getd(e[i].v,u,d+);
}
LL calc(int u,int d)
{
end=;
getd(u,-,d);
LL ret=;
int l=,r=end-,L,R;
sort(dis,dis+end);
// cout<<u<<":";
// for(int i=0;i<end;i++)cout<<dis[i]<<' ';
// cout<<endl;
while(l<r)
{
while(dis[l]+dis[r]>k && l<r)r--;
if(dis[l]+dis[r]==k)
{
if(dis[l]==dis[r])
{
ret+=((LL)(r-l+)*(LL)(r-l)/);
break;
}
else
{
L=R=;
while(dis[r-]==dis[r])r--,R++;
while(dis[l+]==dis[l])l++,L++;
ret+=((LL)L*(LL)R);L=R=;
r--;l++;
}
}
else l++;
}
return ret;
}
void dfs(int u)
{
now_size=n;
gets(u,-);
getr(u,u,-);
ans+=calc(root,);
vis[root]=;
for(int i=first[root];i!=-;i=e[i].next)
if(!vis[e[i].v])
{
ans-=calc(e[i].v,);
dfs(e[i].v);
}
return;
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
memset(first,-,sizeof(first));
n=read();k=read();
for(int i=;i<n-;i++)
{
a=read();b=read();
addEdge(i*,a,b);addEdge(i*+,b,a);
}
dfs();
printf("%lld\n",ans);
return ;
}

[冬令营day1T3]Tree的更多相关文章

  1. 牛客网字节跳动冬令营网络赛J Sortable Path on Tree —— 点分治

    题目:https://ac.nowcoder.com/acm/contest/296/J 用点分治: 记录了值起伏的形态,二元组 (x,y) 表示有 x 个小于号,y 个大于号: 因为小于号和大于号都 ...

  2. NOI2019冬令营报到通知

    由中国计算机学会(CCF)主办的2019全国青少年信息学奥林匹克冬令营(CCF NOI 2019冬令营)将于2019年1月24日-31日在广州市第二中学举行.其中1月24日为报到日,1月31日为疏散日 ...

  3. 数学-Matrix Tree定理证明

    老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...

  4. [特别篇] 记JZ冬令营(Finished)

    1.16 走错班了, 去了全是大佬的1班, 然后灰溜溜滚回2班了. 去参加开营仪式. 然而昏昏欲睡... 实在太累了澡也没洗.. 群英云集, 多是感慨. 当时依依惜别和铮铮誓言, 在重逢中无语凝噎. ...

  5. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  6. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  7. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  8. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  9. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

随机推荐

  1. java8 HashTable 原理

    HashTable原理 Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现.Hashtable中的方法是同步的,而HashMap方法(在 ...

  2. 分布式数据库缓存系统Apache Ignite

    Apache Ignite内存数据组织是高性能的.集成化的以及分布式的内存平台,他可以实时地在大数据集中执行事务和计算,和传统的基于磁盘或者闪存的技术相比,性能有数量级的提升. 将数据存储在缓存中能够 ...

  3. 通过消息总线Spring Cloud Bus实现配置文件刷新(使用Kafka或RocketMQ)

    如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了.使用 ...

  4. SCCM+WSUS的方式分发补丁

    简单来说,System Center Configuration Manager(SCCM/ConfigMgr)由SMS(Systems Management Server)发展而来,其作为一款针对企 ...

  5. DatetimeHelper类的编写

    公共类 DAtaTimeHelper类的编写 public class Appointment { public DateTime StartDate { get; set; } public Dat ...

  6. 深入解析 Go 中 Slice 底层实现

    原文: https://halfrost.com/go_slice/   切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合.切片的设计想法是由动态数组概念而来,为了开发者可以更加 ...

  7. windows 2012 IIS 部署 .net core HTTP Error 502.5 - Process Failure 错误解决办法

    安装系统补丁: 2012 R2对应>Windows8.1-KB2999226-x64.msu 下载地址: https://www.microsoft.com/zh-CN/download/det ...

  8. vue-cli vue脚手架搭建步骤

    提前在E:\nodejs文件夹下建立node_gobal和node_cache 并配置环境变量NODE_PATH:E:\nodejs\node_global\node_modules 改变用户变量中的 ...

  9. Markdown 文件如何实现 chm 文件打包

    需要借助2个工具,下面的链接都有对应的网址 LME和 hhw, 有不清楚的可以下面评论,7*24小时在线解答问题,也可以加博主微信 首先借助 Markdown To CHM(LME) 工具将Markd ...

  10. 实验吧——看起来有点难(sql盲注)

    题目地址:http://ctf5.shiyanbar.com/basic/inject/ 首先当然是拿admin/admin来试试啊,多次测试发现,有两种错误提示 1.数据库连接失败! 2.登录失败, ...