题目链接:南昌邀请赛网络赛Distance on the tree
统计一条链上边权小于k的边数。
树上差分,对于边权来说,一条链上的边的条数=sum[x]+sum[y]-2*sum[lca(x,y)]。
对于点权来说,点数=sum[x]+sum[y]-sum[lca(x,y)]-sum[fa[lca(x,y)]]。
在求祖先的时候,需要用到树上倍增+lca。其余的就在主席树上去找就好了。
代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;const int maxx=1e5+100;
struct node{int l;int r;int sum;
}p[maxx*20];
int head[maxx<<1];
int dp[maxx][22];
int val[maxx];
int deep[maxx];
int root[maxx];
struct edge{int to,next,w;
}e[maxx<<1];
int tot,n,m,len,ror;
/*-------------事前准备--------------*/
inline int getid(int w)
{return lower_bound(val+1,val+len+1,w)-val;
}
inline void init()
{for(int i=0;i<=n;i++)for(int j=0;j<=20;j++) dp[i][j]=0;memset(head,-1,sizeof(head));tot=0;ror=0;
}
inline void add(int u,int v,int w)
{e[tot].to=v,e[tot].next=head[u],e[tot].w=w,head[u]=tot++;
}
/*-------------主席树--------------*/
inline void pushup(int cur)
{p[cur].sum=p[p[cur].l].sum+p[p[cur].r].sum;
}
inline int build(int l,int r)
{int cur=++ror;p[cur].sum=0;if(l==r) return cur;int mid=l+r>>1;p[cur].l=build(l,mid);p[cur].r=build(mid+1,r);return cur;
}
inline int update(int pos,int rot,int l,int r)
{int cur=++ror;p[cur]=p[rot];if(l==r) {p[cur].sum++;return cur;}int mid=l+r>>1;if(pos<=mid) p[cur].l=update(pos,p[rot].l,l,mid);else p[cur].r=update(pos,p[rot].r,mid+1,r);pushup(cur);return cur;
}
inline int query(int lrot,int rrot,int frot,int l,int r,int sum)
{if(r<=sum) return p[lrot].sum+p[rrot].sum-p[frot].sum*2;int mid=l+r>>1;int ret=p[p[lrot].l].sum+p[p[rrot].l].sum-p[p[frot].l].sum*2;if(sum<=mid) return query(p[lrot].l,p[rrot].l,p[frot].l,l,mid,sum);else return ret+query(p[lrot].r,p[rrot].r,p[frot].r,mid+1,r,sum);
}
/*-------------dfs---------------*/
inline void dfs(int u,int f)
{deep[u]=deep[f]+1;dp[u][0]=f;for(int i=1;i<=20;i++){if(dp[u][i-1]) dp[u][i]=dp[dp[u][i-1]][i-1];else break;}for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to,w=e[i].w;if(to==f) continue;root[to]=update(getid(w),root[u],1,len);dfs(to,u);}
}
/*-----------lca-----------*/
inline int get_lca(int x,int y)
{if(deep[x]<deep[y]) swap(x,y);int tmp=deep[x]-deep[y];for(int i=0;i<=20;i++){if(tmp&(1<<i)) x=dp[x][i];}if(x==y) return x;for(int i=20;i>=0;i--){if(dp[x][i]!=dp[y][i]){x=dp[x][i];y=dp[y][i];}}return dp[x][0];
}
int main()
{int x,y,w;while(~scanf("%d%d",&n,&m)){init();for(int i=1;i<n;i++){scanf("%d%d%d",&x,&y,&w);add(x,y,w);add(y,x,w);val[i]=w;}sort(val+1,val+n);len=unique(val+1,val+n)-val-1;root[0]=build(1,len);deep[0]=1;dfs(1,0);while(m--){scanf("%d%d%d",&x,&y,&w);int z=get_lca(x,y);w=upper_bound(val+1,val+len+1,w)-val-1;//在这里用upper_bound,这样之后找出来的一定是小于等于w的值。if(w==0) printf("0\n");else printf("%d\n",query(root[x],root[y],root[z],1,len,w));}}return 0;
}

努力加油a啊,(o)/~

Distance on the tree(树上倍增+主席树+树上差分+lca)南昌网络赛相关推荐

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

  2. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  3. 2019年ACM-ICPC - 南昌网络赛I:Yukino With Subinterval【带修主席树】

    题目: 2019ICPC南昌网络赛I:Yukino With Subinterval 题意: 给定长度为 N 的数组,有两种操作:(1)单点修改,(2)查询区间[qL,qR]内有多少个不同的段(连续相 ...

  4. 主席树 + 树上倍增 ---- codeforces 587C[树上倍增或者主席树]

    题目链接 给定一棵n个点的树,给定m个人(m≤n)在哪个点上的信息,每个点可以有任意个人:然后给q个询问,每次问u到v上的路径有的点上编号最小的k(k≤10)个人(没有那么多人就该有多少人输出多少人) ...

  5. 2020-2021年度第二届全国大学生算法设计与编程挑战赛 (春季赛)- 天才的操作(线段树+主席树+树上倍增)

    题目链接:点击查看 题目分析:刚看到这个题目的时候,口胡了一个假算法,觉得对于每次询问的操作 [l,r][l,r][l,r] ,只需要找到指令集区间 [l,r][l,r][l,r] 内覆盖到点 kkk ...

  6. [SDOI2013]森林(树上主席树+启发式合并+lca)

    链接:https://ac.nowcoder.com/acm/problem/20577 来源:牛客网 题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有 ...

  7. BZOj #4771. 七彩树(主席树+dfn序+lca)

    BZOj #4771. 七彩树 description solution code description 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色, ...

  8. 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]

    题目传送门 任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任 ...

  9. 【BZOJ3932】任务查询系统,主席树与差分的建树思想

    Time:2016.05.08 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 说真的我一开始做这个题真不知道怎么建树,只知道应该以时间为根建树,记录优先值并维护前缀和,但想不出怎么 ...

最新文章

  1. HybridPose:混合表示下的6D对象姿势估计
  2. ecshop将编辑器更换为kindeditor
  3. java 文件 字符串_java将字符串写入到txt文件中
  4. SAP UI5 Opportunity popup
  5. Mac OSX 开机启动应用
  6. sql oltp_SQL Server中的内存中OLTP的快速概述
  7. linux下原始套接字编程错误:Operation not supported
  8. photoshop 新建文档尺寸预设如何导出保存
  9. 78个学术网站!史上最全常用文献数据库汇总!
  10. oracle 11g duplicate database基于备份复制数据库(五)
  11. word文件怎么另存
  12. 汉字转拼音(不带音调)
  13. element实现form表单动态添加email效果
  14. 鹰迪电商:抖音pk分数怎么看不见?
  15. 【SSLGZ 1614】医院设置(Dijkstra)
  16. RollBack RX Professional 设置快照教程
  17. Android 绘制数字向上向下滚动的动画
  18. 双路由器设置经验:无线路由器接房东的网线,房东给予IP和DNS
  19. 安全软件 Sandboxie v5.31.4 绿色便携版
  20. 逆序输出并求位数 如12345 输出为 54321

热门文章

  1. jquery html data属性,jQuery Mobile Data 属性
  2. mysql怎么创建自动作业_mysql 让一个存储过程定时作业的代码
  3. hive 结构metastone_基于MySQL元数据的Hive的安装和简单测试
  4. 超级马里奥游戏像素素材_《超级马里奥3D世界+库巴之怒》游戏文件尺寸相当小...
  5. python同时输入多个变量_python同时给多个变量赋值|python3教程|python入门|python教程...
  6. Qt::WA_TransparentForMouseEvents用法
  7. 软件之间的数据格式对接往往将_XRD数据格式的转换和TXT格式数据正确导入Jade的办法...
  8. (6)kendo UI使用基础介绍与问题整理——dropdownlist/基础问题整理
  9. 浪潮存储双活方案:新疆道路运输管理局的大数据应用不再是梦
  10. 用csc命令行手动编译cs文件