题目:

  输入点数为N一棵树,求树上长度恰好为K的路径个数

分析:

  题目的数据范围不是很紧,点分治也可以过,树形dp也可以过。这里采用点分治做法。

  我们只需要单开一个类似于桶的数组,跑点分治套路,统计即可,每次处理一棵子树,先在桶上跑统计,处理完一棵子树再更新桶。这样可以保证每一段路径都直接跨过根节点内。

  记得开long long。

代码:

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=,M=;
struct node{int y,nxt;}e[N*];
int d[N],rt,vis[N],siz[N],c=,q[N];
int h[N],n,m,k,mx[N],sm;ll t[M],ans=;
void add(int x,int y){
e[++c]=(node){y,h[x]};h[x]=c;
} void getrt(int x,int fa){
siz[x]=;mx[x]=;
for(int i=h[x],y;i;i=e[i].nxt)
if((y=e[i].y)!=fa&&!vis[y])
getrt(y,x),siz[x]+=siz[y],
mx[x]=max(mx[x],siz[y]);
mx[x]=max(mx[x],sm-siz[x]);
if(mx[x]<mx[rt]) rt=x;return ;
} void dfs(int x,int fa){
q[++q[]]=d[x];
for(int i=h[x],y;i;i=e[i].nxt)
if((y=e[i].y)!=fa&&!vis[y])
d[y]=d[x]+,dfs(y,x);return ;
} void calc(int x){
for(int i=h[x],y;i;i=e[i].nxt)
if(!vis[y=e[i].y]){
q[]=;d[y]=;dfs(y,x);
for(int j=q[];j;j--)
if(q[j]<=k) ans+=t[k-q[j]];
for(int j=q[];j;j--)
if(q[j]<=k) t[q[j]]++;
} memset(t,,sizeof(t));
} void solve(int x){
vis[x]=;t[]=;calc(x);
for(int i=h[x],y;i;i=e[i].nxt)
if(!vis[y=e[i].y]){
sm=siz[y];mx[rt=]=N;
getrt(y,);solve(rt);
} return ;
} int main(){
scanf("%d%d",&n,&k);
for(int i=,x,y;i<n;i++)
scanf("%d%d",&x,&y),add(x,y),add(y,x);
mx[rt]=sm=n;getrt(,);solve(rt);
printf("%lld\n",ans);return ;
}

点分治

CF161D Distance in Tree 点分治的更多相关文章

  1. CF161D Distance in Tree

    CF161D Distance in Tree LG传送门 长链剖分板子题. 长链剖分那么好写,跑得又快,为什么要写点分治呢?完了我现在看一道点分治题就想写长链剖分 如果还不会长链剖分请看我博客. 没 ...

  2. CodeChef - PRIMEDST Prime Distance On Tree 树分治 + FFT

    Prime Distance On Tree Problem description. You are given a tree. If we select 2 distinct nodes unif ...

  3. CF161D Distance in Tree(点分治)

    点分治是一种处理树的优秀暴力 这是一道板子题 #include <cstdio> #include <cstring> #include <algorithm> u ...

  4. 洛谷P3806 点分治1 & POJ1741 Tree & CF161D Distance in Tree

    正解:点分治 解题报告: 传送门1! 传送门2! 传送门3! 点分治板子有点多,,,分开写题解的话就显得很空旷,不写又不太好毕竟初学还是要多写下题解便于理解 于是灵巧发挥压行选手习惯,开始压题解(bu ...

  5. [codeforces161D]Distance in Tree(点分治/树形dp)

    题意:求树上距离为k的点对个数: 解题关键:练习一下点分治不用容斥 而直接做的做法.注意先查询,后更新. 不过这个方法有个缺陷,每次以一个新节点为根,必须memset mp数组,或许使用map会好些, ...

  6. [CF161D]Distance in Tree-树状dp

    Problem Distance in tree 题目大意 给出一棵树,求这棵树上有多少个最短距离为k的点对. Solution 这个题目可以用点分治来做,然而我到现在还是没有学会点分治,所以只好用树 ...

  7. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  8. 【树形dp】Distance in Tree

    [CF161.D] Distance in Tree time limit per test 3 seconds memory limit per test 512 megabytes A tree  ...

  9. Codeforces 161D Distance in Tree(树型DP)

    题目链接 Distance in Tree $k <= 500$ 这个条件十分重要. 设$f[i][j]$为以$i$为子树,所有后代中相对深度为$j$的结点个数. 状态转移的时候,一个结点的信息 ...

随机推荐

  1. Luogu P2051[AHOI2009]中国象棋【dp】By cellur925

    题目传送门 题目大意:给定一个$n*m$的棋盘,求放三个“炮”使它们不共行也不共列的方案数.($n,m$$<=100$) 这题主要是转移比较困难,因为情况比较多,所以需要冷静大胆细心地进行分情况 ...

  2. bzoj 4542 [Hnoi2016]大数 (坑)

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4542 题解 Code #include<bits/stdc++.h> using ...

  3. Sublime Text 3列编辑

    Sublime Text 3 的列编辑方式如下 1.使用鼠标 (Ubuntu 14.04验证通过) 不同的平台要使用不同的鼠标按钮: 1.1 OS X 鼠标左键 + Option 或: 鼠标中键 添加 ...

  4. dos 下 批量替换 只支持txt

    首先必须存成 bat 格式,其次识别不了word 1.bat ##替换12 成12*3 @echo offsetlocal enabledelayedexpansionfor /F "tok ...

  5. Spring数据访问1 - 数据源配置及数据库连接池的概念

    无论你要选择哪种数据访问方式,首先你都需要配置好数据源引用. Spring中配置数据源的几种方式 通过在JDBC驱动程序定义的数据源: 通过JNDI查找的数据源: 连接池的数据源: 对于即将发布到生产 ...

  6. 【转】Java集合:HashMap源码剖析

    Java集合:HashMap源码剖析   一.HashMap概述二.HashMap的数据结构三.HashMap源码分析     1.关键属性     2.构造方法     3.存储数据     4.调 ...

  7. JavaScript创建对象的七种方法

    一. 工厂模式 创建: function createPerson(name,behavior){ var p=new Object(); p.name=name; p.behavior=behavi ...

  8. JMeter进入接口压力测试

    关键字: Jmeter.单接口.压力测试.插件监听.服务器端 摘要: 使用Jmeter对单个接口进行压力测试:监听并发量对接口响应时间.服务器资源占量.Jmeter本身只能获取到Tomcat的状态,所 ...

  9. Makefile介绍

    make 工具如 GNU make.System V make 和 Berkeley make 是用来组织应用程序编译过程的基本工具,但是每个 make 工具之间又有所不同.不同的make工具的mak ...

  10. Java进化的尽头

    转载需声明:原文链接网址:http://www.artima.com/weblogs/viewpost.jsp?thread=221903 Java: Evolutionary Dead End 我在 ...