题目:https://www.acwing.com/problem/content/254/

题意:求一棵树上,路径<=k的有多少条

思路:点分治,我们用两个指针算solve函数,首先对算出来的路径每个排个序,我们就保证有单调性,然后l从前往后,r从后往前,如果l+r<=m  那么(l,r-1) (l,r-2)...都是可以的,直接加上总数即可,如果不满足 r--,满足l++,这个自己写个例子就能明白的

  1. #include<bits/stdc++.h>
  2. #define maxn 100005
  3. #define mod 1000000007
  4. using namespace std;
  5. typedef long long ll;
  6. ll da;
  7. vector<pair<ll,ll> > mp[maxn];//存下图
  8. bool vis[maxn];//标记曾经使用过的重心
  9. ll maxsize[maxn],dis[maxn],d[maxn];//maxsize 当前节点的最大子树
  10. ll siz[maxn],e[maxn];// dis 到重心的距离 d 出现过的距离
  11. ll n,m,rt,sum,qe; // siz 当前节点的子树个数 e 出现的距离 rt代表当前重心
  12. void find(ll x,ll f){//找出重心
  13. siz[x]=;
  14. maxsize[x]=;
  15. for(int i=;i<mp[x].size();i++){
  16. pair<ll,ll> q=mp[x][i];
  17. if(q.first==f||vis[q.first]) continue;//vis数组标记曾经使用过的重心
  18. find(q.first,x);
  19. siz[x]+=siz[q.first];
  20. maxsize[x]=max(maxsize[x],siz[q.first]);
  21. }
  22. maxsize[x]=max(maxsize[x],sum-siz[x]);//节点总数减去当前的子树数=以当前节点为根的父亲点子树数
  23. if(maxsize[x]<maxsize[rt]){
  24. rt=x;
  25. }
  26. }
  27. void get_dis(ll x,ll f,ll len){
  28. if(len<=1e7){
  29. e[++qe]=len;
  30. }
  31. for(int i=;i<mp[x].size();i++){
  32. pair<ll,ll> q=mp[x][i];
  33. if(q.first==f||vis[q.first]) continue;
  34. dis[q.first]=dis[x]+len;
  35. get_dis(q.first,x,len+q.second);
  36. }
  37. }
  38. ll solve(ll x,ll len){
  39. ll ee=;
  40. qe=;
  41. dis[x]=len;
  42. get_dis(x,,len);
  43. sort(e+,e+qe+);
  44. ll l=,r=qe;
  45. while(l<r){
  46. if(e[l]+e[r]<=m){
  47. ee+=r-l;
  48. l++;
  49. }
  50. else{
  51. r--;
  52. }
  53. }
  54. return ee;
  55. }
  56. void divide(ll x){
  57. da+=solve(x,);
  58. vis[x]=;
  59. for(int i=;i<mp[x].size();i++){
  60. pair<ll,ll> q=mp[x][i];
  61. if(vis[q.first]) continue;
  62. da-=solve(q.first,q.second);
  63. sum=siz[q.first];
  64. rt=;
  65. maxsize[rt]=mod;
  66. find(q.first,x);
  67. divide(rt);
  68. }
  69. }
  70. void init(){
  71. da=;
  72. for(int i=;i<=n;i++) mp[i].clear();
  73. memset(maxsize,,sizeof(maxsize));
  74. memset(vis,,sizeof(vis));
  75. }
  76. int main(){
  77. while(cin>>n>>m)
  78. {
  79. if(n==&&m==) break;
  80. ll a,b,c;
  81. init();
  82. for(int i=;i<n-;i++){
  83. cin>>a>>b>>c;
  84. a++;
  85. b++;
  86. mp[a].push_back(make_pair(b,c));
  87. mp[b].push_back(make_pair(a,c));
  88. }
  89. sum=n;//当前节点数
  90. rt=;
  91. maxsize[]=mod;//置初值
  92. find(,);
  93. divide(rt);
  94. printf("%lld\n",da);
  95. }
  96. }

AcWing 252. 树 (点分治)打卡的更多相关文章

  1. hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)

    题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...

  2. 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治

    正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...

  3. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  4. POJ 1741 Tree 树的分治

    原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...

  5. hdu 4871 树的分治+最短路记录路径

    /* 题意:给你一些节点和一些边,求最短路径树上是k个节点的最长的路径数. 解:1.求出最短路径树--spfa加记录 2.树上进行操作--树的分治,分别处理子树进行补集等运算 */ #include& ...

  6. hdu 4670 树的分治-求点对的个数

    /* 树的分治 因为树的点权值可达到10^15,注意手动扩栈,还有int64 题意:给你一棵树,给你一些素数,给你每个点一个权值且每个权值均可由这些素数组成.现在定义任意任意两点的价值为他们路径上的权 ...

  7. AcWing 157. 树形地铁系统 (hash判断树同构)打卡

    一些主要城市拥有树形的地铁系统,即在任何一对车站之间,有且只有一种方式可以乘坐地铁. 此外,这些城市大多数都有一个中央车站. 想象一下,你是一名在拥有树形地铁系统的城市游玩的游客,你想探索该城市完整的 ...

  8. 【BZOJ-4435】Juice Junctions 最小割树(分治+最小割)+Hash

    4435: [Cerc2015]Juice Junctions Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 20  Solved: 11[Submi ...

  9. BZOJ 4025: 二分图 [线段树CDQ分治 并查集]

    4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...

随机推荐

  1. jmeter之集合点的使用

    通过jmeter并不能1秒立即达到某一并发,这时候,可以通过集合点来实现,达到某一并发时,然后再一起执行某一动作,仅作用于第一次动作的时候 目录 1.集合点元件 2.简单的概念介绍 1.集合点元件 集 ...

  2. Schema 与数据类型优化

    这是<高性能 MySQL(第三版)>第四章<Schema 与数据类型优化>的读书笔记. 1. 选择优化的数据类型 数据类型的选择原则: 越小越好:选择满足需求的最小类型.注意, ...

  3. php Function ereg() is deprecated的解决方法

    PHP 5.3 ereg() 无法正常使用,提示“Function ereg() is deprecated Error”.问题根源是php中有两种正则表示方法,一个是posix,一个是perl,ph ...

  4. [LeetCode] 461. Hamming Distance(位操作)

    传送门 Description The Hamming distance between two integers is the number of positions at which the co ...

  5. 线程池之ThreadPoolExecutor源码解析

    1.变量 ThreadPoolExecutor先定义了这几个常量,初看时一脸懵逼,其实它就是用int的二进制高三位来表示线程池的状态, 先回顾一下位运算: <<’左移:右边空出的位置补0, ...

  6. nodejs基础-HTTP

    案例通过nodejs编写http服务程序 步骤:1,加载http模块2.创建http服务3.为http服务对象添加request事件处理程序4·开启http服务监听,准备接收客户端请求注意:1,浏览器 ...

  7. eclipse 从git取项目,导入为maven项目,新加的方法,报加载主类错误

    eclipse 从git取项目,导入为maven项目,新加的方法,报加载主类错误 具体描述: 整体编译能够编译成功,但新加一个java,里面创建一个main方法,运行时,报无法加载主类的错误, 整体编 ...

  8. [CodeForces 52C]Circular RMQ

    题目传送门 评分:省选/NOI-,难度:普及+/提高 这题真的和RMQ没有半点关系,只需要一个裸的线段树,连pushdown都不需要,只需要两种操作:区间修改和区间求最小值,在回溯时加上标记即可,唯一 ...

  9. 【freemarker】渲染列表一系列操作

    数据模型: public class AddressVo implements Serializable { private static final long serialVersionUID = ...

  10. lmbench的使用方法

    一.引言 要评价一个系统的性能,通常有不同的指标,相应的会有不同的测试方法和测试工具,一般来说为了确保测试结果的公平和权威性,会选用比较成熟的商业测试软件.但在特定情形下,只是想要简单比较不同系统或比 ...