Distance on the tree

https://nanti.jisuanke.com/t/38229

DSM(Data Structure Master) once learned about tree when he was preparing for NOIP(National Olympiad in Informatics in Provinces) in Senior High School. So when in Data Structure Class in College, he is always absent-minded about what the teacher says.

The experienced and knowledgeable teacher had known about him even before the first class. However, she didn't wish an informatics genius would destroy himself with idleness. After she knew that he was so interested in ACM(ACM International Collegiate Programming Contest), she finally made a plan to teach him to work hard in class, for knowledge is infinite.

This day, the teacher teaches about trees." A tree with nn nodes, can be defined as a graph with only one connected component and no cycle. So it has exactly n-1n−1 edges..." DSM is nearly asleep until he is questioned by teacher. " I have known you are called Data Structure Master in Graph Theory, so here is a problem. "" A tree with nn nodes, which is numbered from 11 to nn. Edge between each two adjacent vertexes uuand vv has a value w, you're asked to answer the number of edge whose value is no more than kk during the path between uu and vv."" If you can't solve the problem during the break, we will call you DaShaMao(Foolish Idiot) later on."

The problem seems quite easy for DSM. However, it can hardly be solved in a break. It's such a disgrace if DSM can't solve the problem. So during the break, he telephones you just for help. Can you save him for his dignity?

Input

In the first line there are two integers n,mn,m, represent the number of vertexes on the tree and queries(2 \le n \le 10^5,1 \le m \le 10^52≤n≤105,1≤m≤105)

The next n-1n−1 lines, each line contains three integers u,v,wu,v,w, indicates there is an undirected edge between nodes uu and vv with value ww. (1 \le u,v \le n,1 \le w \le 10^91≤u,v≤n,1≤w≤109)

The next mm lines, each line contains three integers u,v,ku,v,k , be consistent with the problem given by the teacher above. (1 \le u,v \le n,0 \le k \le 10^9)(1≤u,v≤n,0≤k≤109)

Output

For each query, just print a single line contains the number of edges which meet the condition.

样例输入1复制

3 3
1 3 2
2 3 7
1 3 0
1 2 4
1 2 7

样例输出1复制

0
1
2

样例输入2复制

5 2
1 2 1000000000
1 3 1000000000
2 4 1000000000
3 5 1000000000
2 3 1000000000
4 5 1000000000

样例输出2复制

2
4 题意:给一颗树,有m次询问,每次询问 u v w,求u到v的路径中有多少边权值<=w。
思路:第一次遇到这种题目(还是太菜= =),lca+主席树
以1为根结点,在跑dfs时建立主席树,查询某点时查询根结点到该点有多少条小于等于k的路径,像求lca一样,答案就是查询的那两条路径上的答案 减去 两倍的 根节点到它们最近公共祖先的答案
 #include<bits/stdc++.h>
#define ll long long
#define maxn 100005
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define pb push_back
#define pii pair<int,int>
using namespace std; vector<pii>ve[maxn];
int fa[maxn][],deep[maxn];
int n;
struct sair{
int l,r,v;
}tree[maxn*];
int root[maxn],cnt; void add(int pre,int now,int val,int l,int r){
tree[now].v=tree[pre].v+;
if(l==r){
return;
}
int mid=l+r>>;
if(val<=mid){
tree[now].l=++cnt;
tree[now].r=tree[pre].r;
add(tree[pre].l,tree[now].l,val,l,mid);
}
else{
tree[now].r=++cnt;
tree[now].l=tree[pre].l;
add(tree[pre].r,tree[now].r,val,mid+,r);
}
} int query(int now,int val,int l,int r){
if(l==r){
return tree[now].v;
}
int mid=l+r>>;
if(val<=mid){
return query(tree[now].l,val,l,mid);
}
else{
return tree[tree[now].l].v+query(tree[now].r,val,mid+,r);
}
} void dfs(int now,int pre,int dep){
deep[now]=dep;
fa[now][]=pre;
if(pre==) fa[now][]=now;
for(int i=;i<ve[now].size();i++){
if(ve[now][i].first!=pre){
if(!root[now]) root[now]=++cnt;
if(!root[ve[now][i].first]) root[ve[now][i].first]=++cnt;
add(root[now],root[ve[now][i].first],ve[now][i].second,,1e9+);
dfs(ve[now][i].first,now,dep+);
}
}
} void Init(){
for(int i=;i<=;i++){
for(int j=;j<=n;j++){
fa[j][i]=fa[fa[j][i-]][i-];
}
}
} int lca(int x,int y){
if(deep[x]<deep[y]) swap(x,y);
for(int i=;i>=;i--){
if(deep[fa[x][i]]>=deep[y]){
x=fa[x][i];
}
}
if(x==y) return x;
for(int i=;i>=;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][];
} int main(){
int m;
scanf("%d %d",&n,&m);
int u,v,w;
for(int i=;i<n;i++){
scanf("%d %d %d",&u,&v,&w);
ve[u].pb({v,w});
ve[v].pb({u,w});
}
dfs(,,);
Init();
while(m--){
scanf("%d %d %d",&u,&v,&w);
int ans=query(root[u],w,,1e9+)+query(root[v],w,,1e9+);
ans-=query(root[lca(u,v)],w,,1e9+)*;
printf("%d\n",ans);
} }
/*
3 3
1 3 2
2 3 7
1 3 0
1 2 4
1 2 7
*/

Distance on the tree的更多相关文章

  1. ural1471 Distance in the Tree

    Distance in the Tree Time limit: 1.0 secondMemory limit: 64 MB A weighted tree is given. You must fi ...

  2. 南昌网络赛J. Distance on the tree 树链剖分+主席树

    Distance on the tree 题目链接 https://nanti.jisuanke.com/t/38229 Describe DSM(Data Structure Master) onc ...

  3. 南昌网络赛J. Distance on the tree 树链剖分

    Distance on the tree 题目链接 https://nanti.jisuanke.com/t/38229 Describe DSM(Data Structure Master) onc ...

  4. 2019南昌邀请赛网络预选赛 J.Distance on the tree(树链剖分)

    传送门 题意: 给出一棵树,每条边都有权值: 给出 m 次询问,每次询问有三个参数 u,v,w ,求节点 u 与节点 v 之间权值 ≤ w 的路径个数: 题解: 昨天再打比赛的时候,中途,凯少和我说, ...

  5. Distance on the tree(数剖 + 主席树)

    题目链接:https://nanti.jisuanke.com/t/38229 题目大意:给你n个点,n-1条边,然后是m次询问,每一次询问给你u,v,w然后问你从u -> v 的路径上有多少边 ...

  6. 南昌网络赛 Distance on the tree 主席树+树剖 (给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数。)

    https://nanti.jisuanke.com/t/38229 题目: 给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数. #include <bits/stdc++.h ...

  7. 2019南昌邀请赛网络赛:J distance on the tree

    1000ms 262144K   DSM(Data Structure Master) once learned about tree when he was preparing for NOIP(N ...

  8. 2019年ICPC南昌网络赛 J. Distance on the tree 树链剖分+主席树

    边权转点权,每次遍历到下一个点,把走个这条边的权值加入主席树中即可. #include<iostream> #include<algorithm> #include<st ...

  9. 【树形dp】【CF161D】distance on a tree + 【P1352】没有上司的舞会

    T1题面: 输入点数为N一棵树 求树上长度恰好为K的路径个数 (n < 1e5, k < 500) 这是今天的考试题,也是一道假的紫题,因为我一个根本不会dp的蒟蒻只知道状态就一遍A掉了- ...

随机推荐

  1. Spring事件通知机制

    在上图中,调用 getApplicationEventMulticaster()方法,该方法返回的ApplicationEventMulticaster类型的对象applicationEventMul ...

  2. 持续更新scrapy的错误,ValueError: Missing scheme in request url:

    只需要将 for href in response.xpath('XX').extract(): yield Request(hrefs) 修改为下面,就可以显示出来 for href in resp ...

  3. mysql常规巡检

    mysql常规巡检   目录 一.巡检脚本 二.下载巡检脚本 三.脚本执行说明 1.inspection.conf 使用说明 2.inspection_mysql.sh 使用说明 3.mysqltun ...

  4. com.android.build.api.transformException报错的解决方法

    最近遇到一个问题:工程需要依赖模块1和模块2,但是模块1和模块2都使用了opencv,但opencv的版本不同,如果同时依赖两个模块,就会报错重复定义...如果模块2依赖模块1,工程再依赖模块2,也会 ...

  5. MyBatis学习总结-MyBatis快速入门的系列教程

    MyBatis学习总结-MyBatis快速入门的系列教程 [MyBatis]MyBatis 使用教程 [MyBatis]MyBatis XML配置 [MyBatis]MyBatis XML映射文件 [ ...

  6. (最完美)红米手机4的USB调试模式在哪里开启的经验

    每次我们使用安卓手机通过数据线连接上Pc的时候,或者使用的有些应用比如我们团队营销部门每次使用的应用引号精灵,之前的老版本就需要开启Usb开发者调试模式下使用,现每次新版本不需要了,如果手机没有开启U ...

  7. C# 反射,动态类,动态方法

    1.动态类名,固定方法名,例如.调用不同类下边的GetById()方法: //项目需要引用Miscorsoft.CSharp类库,否则会报错:找不到编译动态表达式所需的一个或者多个类型.//引用这两个 ...

  8. Javascript面向对象编程(二)

    子承父业 该方法利用了call,apply,按照原有的方式进行复制,做一些改进,最后进行事务处理.废话不多说,直接看例子. 在这里我提一下,call和apply的异同:它们两个都可以改变this指向, ...

  9. Jmeter5.1.1创建一个http请求的压力测试

    1.首先添加一个线程组,在线程组中,配置压力情况 2.然后在线程组中,添加取样器,添加http请求:配置web服务器协议(http/https).服务器名称或IP.端口号.请求方法.路径等参数 3.然 ...

  10. LocalVariableTable之 Slot 复用

    LocalVariableTable中的 Slot, 是存在复用现象的,这个我早就知道,但是,不太清楚是如何复用的. Java语言规范与JVM规范都没有对Java语言具体要如何使用JVM的局部变量sl ...