[冬令营day1T3]Tree
题目描述 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的更多相关文章
- 牛客网字节跳动冬令营网络赛J Sortable Path on Tree —— 点分治
题目:https://ac.nowcoder.com/acm/contest/296/J 用点分治: 记录了值起伏的形态,二元组 (x,y) 表示有 x 个小于号,y 个大于号: 因为小于号和大于号都 ...
- NOI2019冬令营报到通知
由中国计算机学会(CCF)主办的2019全国青少年信息学奥林匹克冬令营(CCF NOI 2019冬令营)将于2019年1月24日-31日在广州市第二中学举行.其中1月24日为报到日,1月31日为疏散日 ...
- 数学-Matrix Tree定理证明
老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...
- [特别篇] 记JZ冬令营(Finished)
1.16 走错班了, 去了全是大佬的1班, 然后灰溜溜滚回2班了. 去参加开营仪式. 然而昏昏欲睡... 实在太累了澡也没洗.. 群英云集, 多是感慨. 当时依依惜别和铮铮誓言, 在重逢中无语凝噎. ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
随机推荐
- 使用windows 上的远程连接来远程Linux Ubuntu系统的设置
实验环境: Windows 10 , VMware Workstation ,Ubuntu16.04 1.root登录ubuntu,然后执行下面的命令 # root账户登录ubuntu ,执行下面的命 ...
- CountDownLatch 源码分析
CountDownLatch 源码分析: 1:CountDownLatch数据结构 成员变量 Sync类型对象 private final Sync sync; Sync是继承AQS的一个类,Coun ...
- Turbo码基本框架
1. 基本原理 1.1 定义 1.2 分量码设计 2. 编码方法 2.1 交织器的设计 2.2 分量编码器 2.3 删余矩阵及复用 3. 译码方法和算法 3.1 迭代译码 3.2 MAP类算法 3.3 ...
- R数据挖掘 第三篇:聚类的评估(簇数确定和轮廓系数)和可视化
在实际的聚类应用中,通常使用k-均值和k-中心化算法来进行聚类分析,这两种算法都需要输入簇数,为了保证聚类的质量,应该首先确定最佳的簇数,并使用轮廓系数来评估聚类的结果. 一,k-均值法确定最佳的簇数 ...
- 使用 Spring Boot 构建 RESTful API
1. 使用 Idea 创建 Spring Initializer 项目 在创建项目的对话框中添加 Web 和 Lombok,或者建立项目后在 pom.xml 中添加依赖: <dependency ...
- 使用order by和group by的分析
mysql 写sql的顺序: select -> from-> where->group by->having->order by. 但mysql的解析 ...
- Spring Boot 实战 入门
目前没有系统学习过 Spring 框架,参与工作时,直接参与到了 Spring Boot 项目的开发.目前还比较菜,所以,你要是和我一样,不妨也跳过 Spring 框架的学习,直接学习 Sring B ...
- <Android Studio> 3.打包APK
我的IDE版本是 3.5 我希望输出的apk文件格式是: 名称_v版本_release/debug_日期 时间.apk 步骤: 1.打开build.gradle 末尾添加如下代码 def releas ...
- 给easyui datebox扩展一个清空按钮,无侵入
/** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; (function ($) { var buttons = $.ext ...
- eclipse自定义自动补全语句
1. Windows-->preferences 2. 弹出框选择, Java-->Editor-->Templates-->New 3. 弹出框输入, 1.Name--名字, ...