点分治是一种处理树的优秀暴力

这是一道板子题

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int u[50010<<1],v[50010<<1],fir[50010],nxt[50010<<1],cnt,root,sz[50010],f[50010],middis[50010],midcnt,n,k,vis[50010],Siz;
long long ans=0;
void addedge(int ui,int vi){
++cnt;
u[cnt]=ui;
v[cnt]=vi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
void getroot(int u,int fa){
sz[u]=1,f[u]=1;
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==fa||vis[v[i]])
continue;
getroot(v[i],u);
sz[u]+=sz[v[i]];
f[u]=max(f[u],sz[v[i]]);
}
f[u]=max(Siz-sz[u],f[u]);
if(f[u]<f[root])
root=u;
}
void getdis(int u,int d,int fa){
// printf("ux=%d\n",u);
middis[++midcnt]=d;
for(int i=fir[u];i;i=nxt[i]){
if(vis[v[i]]||v[i]==fa)
continue;
getdis(v[i],d+1,u);
}
}
int look1(int l,int k){
int ans=0,r=midcnt;
while(l<=r){
int mid=(l+r)>>1;
if(middis[mid]<k)
l=mid+1;
else
ans=mid,r=mid-1;
}
return ans;
}
int look2(int l,int k){
int ans=0,r=midcnt;
while(l<=r){
int mid=(l+r)>>1;
if(middis[mid]<=k)
l=mid+1,ans=mid;
else
r=mid-1;
}
return ans;
}
int solve(void){
sort(middis+1,middis+midcnt+1);
// for(int i=1;i<=midcnt;i++)
// printf("%d ",middis[i]);
// getchar();
// printf("\n");
int mid=0;
int l=1;
while(l<midcnt&&middis[l]+middis[midcnt]<k)
++l;
while(l<midcnt&&k-middis[l]>=middis[l]){
int l2=look2(l+1,k-middis[l]),l1=look1(l+1,k-middis[l]);
if(l2>=l1)
mid+=l2-l1+1;
l++;
}
return mid;
}
void divide(int u){
// printf("u=%d\n",u);
// getchar();
vis[u]=true;
midcnt=0;
getdis(u,0,0);
// printf("ok\n");
ans+=solve();
// printf("an=%d\n",ans);
for(int i=fir[u];i;i=nxt[i]){
if(vis[v[i]])
continue;
midcnt=0;
getdis(v[i],1,0);
ans-=solve();
// printf("s=%d\n",ans);
root=0;
Siz=sz[v[i]];
getroot(v[i],u);
divide(root);
}
}
int main(){
scanf("%d %d",&n,&k);
for(int i=1;i<=n-1;i++){
int a,b;
scanf("%d %d",&a,&b);
addedge(a,b);
addedge(b,a);
}
Siz=n;
f[0]=0x3f3f3f3f;
getroot(1,0);
divide(root);
printf("%lld",ans);
return 0;
}

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

  1. CF161D Distance in Tree 点分治

    题目: 输入点数为N一棵树,求树上长度恰好为K的路径个数 分析: 题目的数据范围不是很紧,点分治也可以过,树形dp也可以过.这里采用点分治做法. 我们只需要单开一个类似于桶的数组,跑点分治套路,统计即 ...

  2. CF161D Distance in Tree

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

  3. 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 ...

  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. Linq To SQL LEFT OUTER JOIN (Left Join)

    SQL: SELECT [t0].[ProductName], [t1].[TotalPrice] AS [TotalPrice] FROM [Product] AS [t0] LEFT OUTER ...

  2. Marlin 擠出頭溫度控制PID值校正

    Marlin 擠出頭溫度控制PID值校正 擠出頭加熱器.溫度感應器安裝好後,先別急著直接指定工作溫度並且加熱.因為控制板上的溫度控制PID參數尚未校正.如果加熱速度過快,有可能會加熱過度並且導致零件燒 ...

  3. Spark学习之路 (七)Spark 运行流程

    一.Spark中的基本概念 (1)Application:表示你的应用程序 (2)Driver:表示main()函数,创建SparkContext.由SparkContext负责与ClusterMan ...

  4. django中orm使用的注意事项

    必备小知识点 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者 ...

  5. flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法

    请求钩子: 当我们需要对请求进行预处理和后处理时,就可以用Flask提供的回调函数(钩子),他们可用来注册在请求处理的不同阶段执行的处理函数.这些请求钩子使用装饰器实现,通过程序实例app调用,以 b ...

  6. AtCoder Beginner Contest 086 (ABCD)

    A - Product 题目链接:https://abc086.contest.atcoder.jp/tasks/abc086_a Time limit : 2sec / Memory limit : ...

  7. Java学习技术分享:Java中的原子操作

    学习java需要有一套完整的学习线路,需要有条理性,当下学习java已经有一段时间了,由当初的懵逼状态逐渐好转,也逐渐养成了写技术学习笔记的习惯,今天总结了一下java中的原子操作. 1.Java中的 ...

  8. Java用Jackson遍历json所有节点

    <!-- jackson begin --> <dependency> <groupId>com.fasterxml.jackson.core</groupI ...

  9. android 颜色值参考,(有颜色图

    ) 2011-10-13 19:55:30| 分类: android | 标签:android颜色值|字号大中小 订阅 Android 常用RGB值以及中英文名称   颜 色 RGB值 英文名 中文名 ...

  10. .net下安装 ZooKeeper.Net

    PM> Install-Package ZooKeeper.Net正在尝试解析依赖项“log4net (≥ 1.2.10)”.正在安装“log4net 1.2.10”.已成功安装“log4net ...