题目链接:https://nanti.jisuanke.com/t/38229

题目大意:给你n个点,n-1条边,然后是m次询问,每一次询问给你u,v,w然后问你从u -> v 的路径上有多少边是小于等于w的、

AC代码:

  1. #include<iostream>
  2. #include<cmath>
  3. #include<stack>
  4. #include<queue>
  5. #include<stdio.h>
  6. #include<string>
  7. #include<cstring>
  8. #include<algorithm>
  9. using namespace std;
  10. # define inf 0x3f3f3f3f
  11. # define ll long long
  12. const int maxn = 3e5+;
  13. int n,m,num,tot,cnt,totn;
  14. int a[maxn];
  15. int head[maxn];
  16. int root[maxn];
  17. struct Query
  18. {
  19. int l,r,tt;
  20. } que[maxn];
  21. struct Tree
  22. {
  23. int ls,rs,sum;
  24. } tr[maxn*];
  25. struct Edge
  26. {
  27. int from,to,val,s;
  28. } edges[maxn<<];
  29. void addedge(int x,int y,int z)
  30. {
  31. edges[++tot]=Edge{x,y,z,head[x]};
  32. head[x]=tot;
  33. }
  34. int d[maxn],fa[maxn],size[maxn],w[maxn];
  35. int son[maxn];
  36. int rk[maxn],kth[maxn],top[maxn];
  37. void dfs1(int u,int pre,int val)
  38. {
  39.  
  40. d[u]=d[pre]+;
  41. fa[u]=pre;
  42. size[u]=;
  43. w[u]=val;
  44. for(int i=head[u]; i!=-; i=edges[i].s)
  45. {
  46. Edge &e=edges[i];
  47. if(e.to==pre)
  48. continue;
  49. dfs1(e.to,u,e.val);
  50. size[u]+=size[e.to];
  51. if(size[e.to]>size[son[u]])
  52. son[u]=e.to;
  53. }
  54. }
  55. void dfs2(int u,int y)
  56. {
  57. rk[u]=++cnt;
  58. kth[cnt]=u;
  59. top[u]=y;
  60. if(son[u]==)
  61. return ;
  62. dfs2(son[u],y);
  63. for(int i=head[u]; i!=-; i=edges[i].s)
  64. {
  65. Edge &e=edges[i];
  66. if(e.to==son[u]||e.to==fa[u])
  67. continue;
  68. dfs2(e.to,e.to);
  69. }
  70. }
  71. void buildtree(int &x,int l,int r)
  72. {
  73. x=++totn;
  74. if(l==r)
  75. return ;
  76. int mid=(l+r)>>;
  77. buildtree(tr[x].ls,l,mid);
  78. buildtree(tr[x].rs,mid+,r);
  79. }
  80. void add(int &x,int last,int l,int r,int p)
  81. {
  82. x=++totn;
  83. tr[x]=tr[last];
  84. if(l==r)
  85. {
  86. tr[x].sum++;
  87. return ;
  88. }
  89. int mid=l+r>>;
  90. if(p<=mid)
  91. add(tr[x].ls,tr[last].ls,l,mid,p);
  92. if(p> mid)
  93. add(tr[x].rs,tr[last].rs,mid+,r,p);
  94. tr[x].sum=tr[tr[x].ls].sum+tr[tr[x].rs].sum;
  95. }
  96. int ask(int ql,int qr,int l,int r,int kk)
  97. {
  98. if(<=l&&r<=kk)
  99. return tr[qr].sum-tr[ql].sum;
  100. int mid=l+r>>,ans=;
  101. if(<=mid)
  102. ans+=ask(tr[ql].ls,tr[qr].ls,l,mid,kk);
  103. if(mid<kk)
  104. ans+=ask(tr[ql].rs,tr[qr].rs,mid+,r,kk);
  105. return ans;
  106. }
  107. int get_sum(int x,int y,int tt)
  108. {
  109. int ans=;
  110. int fx=top[x],fy=top[y];
  111. while(fx!=fy)
  112. {
  113. if(d[fx]<d[fy])
  114. swap(x,y),swap(fx,fy);
  115. ans+=ask(root[rk[fx]-],root[rk[x]],,num,tt);
  116. x=fa[fx];
  117. fx=top[x];
  118. }
  119. if(d[x]<d[y])
  120. swap(x,y);
  121. ans+=ask(root[rk[y]],root[rk[x]],,num,tt);
  122. return ans;
  123. }
  124. int main()
  125. {
  126. scanf("%d %d",&n,&m);
  127. ll x,y,z,id,ans;
  128. for(int i=; i<=n; i++)
  129. {
  130. head[i]=-;
  131. }
  132. for(int i=; i<=n-; i++)
  133. {
  134. scanf("%d %d %d",&x,&y,&z);
  135. a[++num]=z;
  136. addedge(x,y,z);
  137. addedge(y,x,z);
  138. }
  139. for(int i=; i<=m; i++)
  140. {
  141. scanf("%d %d %d",&que[i].l,&que[i].r,&que[i].tt);
  142. a[++num]=que[i].tt;
  143. }
  144. sort(a+,a+num+);
  145. num=unique(a+,a+num+)-a-;
  146. dfs1(,,inf);
  147. dfs2(,);
  148. for(int i=; i<=n; i++)
  149. {
  150. w[i]=lower_bound(a+,a+num+,w[i])-a;
  151. }
  152. buildtree(root[],,num);
  153. for(int i=; i<=n; i++)
  154. {
  155. add(root[i],root[i-],,num,w[kth[i]]);
  156. }
  157. for(int i=; i<=m; i++)
  158. {
  159. que[i].tt=lower_bound(a+,a+num+,que[i].tt)-a;
  160. int ans=get_sum(que[i].l,que[i].r,que[i].tt);
  161. printf("%d\n",ans);
  162. }
  163. return ;
  164. }

Distance on the tree(数剖 + 主席树)的更多相关文章

  1. 【洛谷2633】Count on a tree(树上主席树)

    点此看题面 大致题意: 给你一棵树,每次问你两点之间第\(k\)小的点权,强制在线. 主席树 这种题目强制在线一般就是数据结构了. 而看到区间第\(k\)小,很容易就能想到主席树. 至少不会有人想到树 ...

  2. BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树

    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...

  3. 【BZOJ4408】[FJOI2016]神秘数(主席树)

    [BZOJ4408][FJOI2016]神秘数(主席树) 题面 BZOJ 洛谷 题解 考虑只有一次询问. 我们把所有数排个序,假设当前可以表示出的最大数是\(x\). 起始\(x=0\). 依次考虑接 ...

  4. Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)

    Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)↗[GO!] 题意 是说有棵树,每个节点上 ...

  5. HDU6621 K-th Closest Distance 第 k 小绝对值(主席树(统计范围的数有多少个)+ 二分 || 权值线段树+二分)

    题意:给一个数组,每次给 l ,r, p, k,问区间 [l, r] 的数与 p 作差的绝对值的第 k 小,这个绝对值是多少 分析:首先我们先分析单次查询怎么做: 题目给出的数据与多次查询已经在提示着 ...

  6. 【SPOJ】10628. Count on a tree(lca+主席树+dfs序)

    http://www.spoj.com/problems/COT/ (速度很快,排到了rank6) 这题让我明白了人生T_T 我知道我为什么那么sb了. 调试一早上都在想人生. 唉. 太弱. 太弱. ...

  7. BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树

    2588: Spoj 10628. Count on a tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/J ...

  8. 洛谷P4587 神秘数 [FJOI2016] 主席树

    正解:主席树 解题报告: 先放下传送门QAQ 首先可以先思考如果只有一组询问,怎么解决 可以这么想,最开始一个数也麻油的时候能表示的最大的数是0嘛 然后先排个序,按顺序每次新加入一个数x,设加入这个数 ...

  9. BZOJ4408: [Fjoi 2016]神秘数【主席树好题】

    Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = ...

随机推荐

  1. vim之快速查找功能

    vim有强大的字符串查找功能. 我们通常在vim下要查找字符串的时候, 都是输入 / 或者 ?  加 需要查找的字符串来进行搜索,比如想搜索 super 这个单词, 可以输入  /super  或者 ...

  2. VirtualBox修改UUID实现虚拟硬盘的重复利用

    其实,记录这个是为了留给自己看.每次用每次查,已经老到什么东西都记不住了.本次查询是从这里(VirtualBox 修改UUID实现虚拟硬盘复制)获得帮助的,感谢. 在VirtualBox把一个已经使用 ...

  3. 为什么很多IT公司不喜欢进过培训机构的人呢?

    转载原文链接:https://www.cnblogs.com/alex3714/p/9105765.html 这几天在知乎看到一个问题“为什么很多IT公司不喜欢进过培训机构的人呢?” 身为老男孩的教学 ...

  4. 想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!

    想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!   很多通信系统发展到某种程度都会有小型化的趋势.一方面小型化可以让系统更加轻便和有效,另一方面,日益发展的IC**技术可以用更低的成本生产 ...

  5. 基于Metronic的Bootstrap开发框架--工作流模块功能介绍(2)

    本篇继续<基于Metronic的Bootstrap开发框架--工作流模块功能介绍>,继续介绍基于Metronic的Bootstrap开发框架的工作模块功能,介绍工作流模块中相关业务表单的界 ...

  6. 使用埃拉托色尼筛选法(the Sieve of Eratosthenes)在一定范围内求素数及反素数(Emirp)

    Programming 1.3 In this problem, you'll be asked to find all the prime numbers from 1 to 1000. Prime ...

  7. python之路4-文件操作

    对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 f = open('lyrics','r',encoding='utf-8') read_line = f.r ...

  8. js基础-字符串常用属性合集

    /*   *   * 实例方法---->必须要通过new的方式创建的对象(实例对象)来调用的方法   * 静态方法---->直接通过大写的构造函数的名字调用的方法(直接通过大写的对象名字调 ...

  9. docker完整配置nginx+php+mysql

    首先了解一个方法: 使用docker exec进入Docker容器 docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用: s ...

  10. js侧边菜单

    目标 实现一个侧边栏菜单,最多二级,可以收起展开.用于系统左侧的主菜单. 大多数系统都会有这样的菜单,用于导航功能,切换到不同的操作页面.在单页应用系统中,菜单一般是固定在左侧,分组节点上配图标,高亮 ...