CF161D Distance in Tree

UPD:憨憨博客 公开处刑

LG传送门

长链剖分板子题。

长链剖分那么好写,跑得又快,为什么要写点分治呢?完了我现在看一道点分治题就想写长链剖分

如果还不会长链剖分请看我博客

没什么好说的,时空复杂度\(O(n)\)直接洛谷rank1。

  1. #include<cstdio>
  2. #include<cctype>
  3. #define R register
  4. #define I inline
  5. using namespace std;
  6. const int S=50003,N=100003;
  7. char buf[1000000],*p1,*p2;
  8. I char gc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,S,stdin),p1==p2)?EOF:*p1++;}
  9. I int rd(){
  10. R int f=0; R char c=gc();
  11. while(c<48||c>57) c=gc();
  12. while(c>47&&c<58) f=f*10+(c^48),c=gc();
  13. return f;
  14. }
  15. int h[S],s[N],g[N],p[S],q[S],d[S],t[S],*f[S],u[S],c,K,*e=u+1; long long o;
  16. I int max(int x,int y){return x>y?x:y;}
  17. I int min(int x,int y){return x<y?x:y;}
  18. I void add(int x,int y){s[++c]=h[x],h[x]=c,g[c]=y;}
  19. void dfs1(int x,int f){p[x]=f,d[x]=t[x]=d[f]+1;
  20. for(R int i=h[x],y;i;i=s[i])
  21. if((y=g[i])^f){dfs1(y,x);
  22. if(t[y]>t[x]) t[x]=t[y],q[x]=y;
  23. }
  24. }
  25. void dfs2(int x){f[x][0]=1;
  26. R int i,j,y,m,n=t[x]-d[x],k;
  27. if(q[x]) f[q[x]]=f[x]+1,dfs2(q[x]);
  28. for(i=h[x];i;i=s[i])
  29. if((y=g[i])^p[x]&&y^q[x]){f[y]=e,m=t[y]-d[y],e+=m+1,dfs2(y);
  30. for(j=max(K-n,0),k=min(m,K-1);j<=k;++j) o+=f[x][K-j]*f[y][j];
  31. for(j=0;j<=m;++j) f[x][j+1]+=f[y][j];
  32. }
  33. if(n>K) o+=f[x][K+1];
  34. }
  35. int main(){
  36. R int n=rd(),i,x,y;
  37. for(K=rd()-1,i=1;i<n;++i) x=rd(),y=rd(),add(x,y),add(y,x);
  38. dfs1(1,0),f[1]=e,e+=t[1],dfs2(1),printf("%lld",o);
  39. return 0;
  40. }

CF161D Distance in Tree的更多相关文章

  1. CF161D Distance in Tree(点分治)

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

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

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

  3. CF161D Distance in Tree 点分治

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

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

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

  5. codeforces 161D Distance in Tree 树形dp

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

  6. 【树形dp】Distance in Tree

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

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

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

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

  9. Distance in Tree CodeForces - 161D

    Distance in Tree CodeForces - 161D 题意:给一棵n个结点的树,任意两点之间的距离为1,现在有点u.v,且u与v的最短距离为k,求这样的点对(u,v)的个数((u,v) ...

随机推荐

  1. angularjs select下拉搜索框

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. JavaScript脚本的执行原理?

    JavaScript是一种动态.弱类型.基于原型的语言,通过浏览器可以直接执行. 当浏览器遇到\<script>标记的时候,浏览器会执行之间的JavaScript代码.嵌入的js代码是顺序 ...

  3. 连接池中的maxIdle,MaxActive,maxWait等参数详解

    转: 连接池中的maxIdle,MaxActive,maxWait等参数详解 2017年06月03日 15:16:22 阿祥小王子 阅读数:6481   版权声明:本文为博主原创文章,未经博主允许不得 ...

  4. php回调函数数组的排序函数

    array_filter() array_map() sort()升序不保存key resort() asort()升序保存key arsort() ksort()根据key排序 krsort()

  5. 利用n 升级工具升级Node.js版本及在mac环境下的坑

    一.利用n 升级Node.js 最近在用NPM安装一个nodejs工具时发现,我的nodejs的版本有些旧了.这不是大问题,只要升级就可以了,当然,重新从nodejs.org最新版本是一种方法,但我想 ...

  6. java读写本地xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <confi ...

  7. Linux 内核版本号查看

    简要:1,lsb_release -a 查看linux系统版本 2,uname -a 查看内核版本

  8. 字符型设备驱动程序-first-printf以及点亮LED灯(二)

    编译这几个函数之前要学一下:Linux 的几个操作命令. 学习地址:http://edu.51cto.com/lesson/id-101824.html 重要的命令 有4个 :分别是 1.lsmod, ...

  9. 登录SQLServer报错:无法连接到DESKTOP-LDJHQGN

    解决方法:下↓↓↓

  10. C++练习 | 递归创建二叉树并求叶子结点的数值和

    #include <iostream> using namespace std; struct Tree { int data; Tree *lchild; Tree *rchild; } ...