//233

  1. 模板 LCA
  2. void dfs(int x,int f){
  3. for(int i=0;i<E[x].size();i++){
  4. int v = E[x][i];
  5. if(v==f)continue;
  6. deep[v]=deep[x]+1;
  7. lca[v][0]=x;
  8. for(int j=1;j<maxm;j++){
  9. int fa = lca[v][j-1];
  10. if(fa==0)continue;
  11. lca[v][j]=lca[fa][j-1];
  12. }
  13. dfs(v,x);
  14. }
  15. }
  16. int up(int x,int d)
  17. {
  18. for(int i=maxm-1;i>=0;i--)
  19. {
  20. if(d<(1<<i))continue;
  21. x=lca[x][i];
  22. d-=(1<<i);
  23. }
  24. return x;
  25. }
  26. int Lca(int x,int y)
  27. {
  28. if(deep[x]>deep[y])swap(x,y);
  29. y=up(y,deep[y]-deep[x]);
  30. if(x==y)return x;
  31. for(int i=maxm-1;i>=0;i--)
  32. {
  33. if(lca[x][i]!=lca[y][i])
  34. x=lca[x][i],y=lca[y][i];
  35. }
  36. return lca[x][0];
  37. }
  38. //树链剖分
  39. #include <cstdio>
  40. #include <cstdlib>
  41. #define maxm 200010
  42. struct edge{int to,len,next;}E[maxm];
  43. int cnt,last[maxm],fa[maxm],top[maxm],deep[maxm],siz[maxm],son[maxm],val[maxm];
  44. void addedge(int a,int b,int len=0)
  45. {
  46. E[++cnt]=(edge){b,len,last[a]},last[a]=cnt;
  47. }
  48. void dfs1(int x)
  49. {
  50. deep[x]=deep[fa[x]]+1;siz[x]=1;
  51. for(int i=last[x];i;i=E[i].next)
  52. {
  53. int to=E[i].to;
  54. if(fa[x]!=to&&!fa[to]){
  55. val[to]=E[i].len;
  56. fa[to]=x;
  57. dfs1(to);
  58. siz[x]+=siz[to];
  59. if(siz[son[x]]<siz[to])son[x]=to;
  60. }
  61. }
  62. }
  63. void dfs2(int x)
  64. {
  65. if(x==son[fa[x]])top[x]=top[fa[x]];
  66. else top[x]=x;
  67. for(int i=last[x];i;i=E[i].next)if(fa[E[i].to]==x)dfs2(E[i].to);
  68. }
  69. void init(int root){dfs1(root),dfs2(root);}
  70. int query(int x,int y)
  71. {
  72. for(;top[x]!=top[y];deep[top[x]]>deep[top[y]]?x=fa[top[x]]:y=fa[top[y]]);
  73. return deep[x]<deep[y]?x:y;
  74. }
  75. int n,m,x,y,v;
  76. int main()
  77. {
  78. scanf("%d%d",&n,&m);
  79. for(int i=1;i<n;i++)
  80. {
  81. scanf("%d%d",&x,&y);addedge(x,y,v);addedge(y,x,v);
  82. }
  83. init(1);
  84. for(int i=1;i<=m;i++)
  85. {
  86. scanf("%d%d",&x,&y);
  87. printf("%d\n",query(x,y));
  88. }
  89. return 0 ;
  90. }

模板 树上求LCA 倍增和树链剖分的更多相关文章

  1. 洛谷P3379 【模板】最近公共祖先(LCA)(树链剖分)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  2. 4.12 省选模拟赛 LCA on tree 树链剖分 树状数组 分析答案变化量

    LINK:duoxiao OJ LCA on Tree 题目: 一道树链剖分+树状数组的神题. (直接nQ的暴力有50. 其实对于树随机的时候不难想到一个算法 对于x的修改 暴力修改到根. 对于儿子的 ...

  3. BZOJ 3626 LCA(离线+树链剖分+差分)

    显然,暴力求解的复杂度是无法承受的. 考虑这样的一种暴力,我们把 z 到根上的点全部打标记,对于 l 到 r 之间的点,向上搜索到第一个有标记的点求出它的深度统计答案.观察到,深度其实就是上面有几个已 ...

  4. BZOJ-3626:LCA(离线+树链剖分)

    Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q ...

  5. HDU 3966 Aragorn's Story(模板题)【树链剖分】+【线段树】

    <题目链接> 题目大意: 给定一颗带点权的树,进行两种操作,一是给定树上一段路径,对其上每个点的点权增加或者减少一个数,二是对某个编号点的点权进行查询. 解题分析: 树链剖分的模板题,还不 ...

  6. HYSBZ 1036树链剖分

    一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从 ...

  7. [树链剖分]BZOJ3589动态树

    题目描述 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你求出几条树枝上 ...

  8. Something about 树链剖分

    声明:部分思路与图片源于OI Wiki 关于树链剖分 树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息. 树链剖分有多种形式,如 重链剖分,长链剖分 和用于 $LCT$ 的剖分,大多数情况下 ...

  9. 【bzoj2238】Mst(树链剖分+线段树)

    2238: Mst Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 465  Solved: 131[Submit][Status][Discuss] ...

随机推荐

  1. bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅

    http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美 ...

  2. bzoj千题计划206:bzoj1076: [SCOI2008]奖励关

    http://www.lydsy.com/JudgeOnline/problem.php?id=1076 很容易想到方程 dp[i][j]表示抛出了i个宝物,已选宝物状态为j的期望最大得分 初始化dp ...

  3. ASP.NET MVC学习(一)之路由篇Route

    什么是路由 通过[路由]配置,路由可以规定URL的特殊格式,使其达到特殊效果. 在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法 ...

  4. JS 简易控制台插件 [供 博客, 论坛 运行js用]

    今天厚着脸皮来推荐下鄙人写的一个小插件吧.看过我博客的应该都熟悉这个插件了,其实就是这货. 这东西是我去年写的,当时水平也不怎么样,不过好歹还是实现了简单功能.我先简单介绍下这东西什么用吧. 因为在 ...

  5. html5 canvas(基本矩形)

    先从简单的开始 fillRect(x,y,width,height) 在坐标x,y的位置加上一个宽,高   如: fillRect(0,0,500,500)//在坐标0,0处加上一个宽高500的填充矩 ...

  6. shell tr命令

    tr 命令可以对来自标准输入的字符进行替换.压缩和删除. tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备. tr 常用参数 -c # 用字符串1中字符集的补集替换此字符集 ...

  7. 重启虚拟目录或站点,不重启iis

    更改站点或虚拟目录的.net Framework 版本会导致重启整个iis服务,所以需要单独重启某个站点或虚拟目录 首先右键点击网站-所有任务-将配置保存到一个文件,从文件中查找到 Location ...

  8. 扩展欧几里得(E - The Balance POJ - 2142 )

    题目链接:https://cn.vjudge.net/contest/276376#problem/E 题目大意:给你n,m,k,n,m代表当前由于无限个质量为n,m的砝码.然后当前有一个秤,你可以通 ...

  9. Useful Online Resources for New Hackers

    出处:https://www.hackerone.com/blog/resources-for-new-hackers HackerOne喜欢花时间与活跃的黑客和有兴趣学习如何破解的人交谈. 就在上周 ...

  10. windows下nodejs服务器的安装与配置

    1下载安装 download from the link: https://nodejs.org/en/ windows下的安装直接运行exe,略过-- 注:由于用户权限的问题,最好将nodejs安装 ...