题目描述 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. 初探Java设计模式4:一文带你掌握JDK中的设计模式

    转自https://javadoop.com/post/design-pattern 行为型模式 策略模式 观察者模式 责任链模式 模板方法模式 状态模式 行为型模式总结 本系列文章将整理到我在Git ...

  2. C# HTTP系列6 HttpWebResponse.StatusCode 响应代码中文详解

    系列目录     [已更新最新开发文章,点击查看详细] 1xx - 信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应 · 100 - Continue ...

  3. 日志模块log4js的配置说明

    1:先安装log4js模块 npm install log4js 目前安装的版本信息:"log4js": "^3.0.5" 2:引用及配置 var log4js ...

  4. 第30课 线程同步(std::condition_variable)

    一. 条件变量 (一)条件变量概述 多线程访问一个共享资源(或称临界区),不仅需要用互斥锁实现独享访问避免并发错误,在获得互斥锁进入临界区后,还需检查特定条件是否成立.当某个线程修改测试条件后,将通知 ...

  5. .NET Core:Json和XML

    (1)Json WebAPI默认使用Json格式,如果需要更改默认的Json设置在Startup的ConfigureServices方法中修改:services.AddMvc() .AddJsonOp ...

  6. C#程序只允许运行一个实例的解决方案

    最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...

  7. Qt Quick 常用元素:ComboBox(下拉列表) 与 ProgressBar(进度条)

    一.ComboBox ComboBox,即下拉列表框,由一个列表框和一个标签控件(或编辑控件)组成.ComboBox 的下拉列表是使用 Menu 实现的,列表内的每个条目对应一个 Menultem. ...

  8. html5预加载图片的写法

    插件还是用 jquery.imgpreload.min.js 只不过初始化加载 必须用window.onload 图片dom都加载完成再显示 不然会有bug <pre> window.on ...

  9. pandas的使用(7)--分组

    pandas的使用(7)--分组

  10. 线程池 ThreadPoolExecutor 类的源码解析

    线程池 ThreadPoolExecutor 类的源码解析: 1:数据结构的分析: private final BlockingQueue<Runnable> workQueue;  // ...