这题有毒!!!!!!!!!!

TM我重新打的板子,然而。。。。。。

5分钟打完 debug两小时

我的写法常数太大了

每次DFS都要For去更新F

最后写了快读才A

改:

只处理f[i][0]

dfs结束在处理f

整整快了一倍多!!!!!!!!

靠!!

烦。。。。

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. #define olinr return
  5. #define love_nmr 0
  6. #define nmr 505050
  7. struct node
  8. {
  9. int nxt,to;
  10. }edge[nmr<<];
  11. int head[nmr];
  12. int n;
  13. int m;
  14. int root;
  15. int f[nmr][];
  16. int dep[nmr];
  17. int cnt;
  18. inline int read()
  19. {
  20. char ch=getchar();
  21. int x=,f=;
  22. while(!isdigit(ch))
  23. {
  24. if(ch=='-')
  25. f=-f;
  26. ch=getchar();
  27. }
  28. while(isdigit(ch))
  29. {
  30. x=(x<<)+(x<<)+(ch^);
  31. ch=getchar();
  32. }
  33. return x*f;
  34. }
  35. inline void put(int x)
  36. {
  37. if(x<)
  38. {
  39. putchar('-');
  40. x=-x;
  41. }
  42. if(x>)
  43. put(x/);
  44. putchar(x%+'');
  45. }
  46. inline void add(int from,int to)
  47. {
  48. cnt++;
  49. edge[cnt].to=to;
  50. edge[cnt].nxt=head[from];
  51. head[from]=cnt;
  52. }
  53. inline void dfs(int x,int fa)
  54. {
  55. dep[x]=dep[fa]+;
  56. f[x][]=fa;
  57. for(int i=head[x];i;i=edge[i].nxt)
  58. {
  59. int go=edge[i].to;
  60. if(go!=fa)
  61. dfs(go,x);
  62. }
  63. }
  64. inline void swap(int &x,int &y)
  65. {
  66. int t=x; x=y; y=t;
  67. }
  68. inline int LCA(int x,int y)
  69. {
  70. if(dep[x]<dep[y]) swap(x,y);
  71. for(int i=;i>=;i--)
  72. if(dep[x]-(<<i)>=dep[y])
  73. x=f[x][i];
  74. if(x==y) olinr x;
  75. for(int i=;i>=;i--)
  76. if(f[x][i]!=f[y][i])
  77. {
  78. x=f[x][i];
  79. y=f[y][i];
  80. }
  81. olinr f[x][];
  82. }
  83.  
  84. int main()
  85. {
  86. n=read();
  87. m=read();
  88. root=read();
  89. int x,y;
  90. for(int i=;i<=n-;i++)
  91. {
  92. x=read();
  93. y=read();
  94. add(x,y);
  95. add(y,x);
  96. }
  97. dfs(root,);
  98. for(int j=;(<<j)<=n;j++)
  99. for(int i=;i<=n;i++)
  100. f[i][j]=f[f[i][j-]][j-];
  101. for(int i=;i<=m;i++)
  102. {
  103. x=read();
  104. y=read();
  105. put(LCA(x,y));
  106. putchar('\n');
  107. }
  108. olinr love_nmr;
  109. }

P3379 【模板】最近公共祖先(LCA)(倍增)的更多相关文章

  1. [模板] 最近公共祖先/lca

    简介 最近公共祖先 \(lca(a,b)\) 指的是a到根的路径和b到n的路径的深度最大的公共点. 定理. 以 \(r\) 为根的树上的路径 \((a,b) = (r,a) + (r,b) - 2 * ...

  2. 【lhyaaa】最近公共祖先LCA——倍增!!!

    高级的算法——倍增!!! 根据LCA的定义,我们可以知道假如有两个节点x和y,则LCA(x,y)是 x 到根的路 径与 y 到根的路径的交汇点,同时也是 x 和 y 之间所有路径中深度最小的节 点,所 ...

  3. luogu3379 【模板】最近公共祖先(LCA) 倍增法

    题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 整体步骤:1.使两个点深度相同:2.使两个点相同. 这两个步骤都可用倍增法进行优化.定义每个节点的Elder[i]为该节点的2^k( ...

  4. 最近公共祖先 LCA 倍增算法

          树上倍增求LCA LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 ...

  5. 最近公共祖先 LCA 倍增法

    [简介] 解决LCA问题的倍增法是一种基于倍增思想的在线算法. [原理] 原理和同样是使用倍增思想的RMQ-ST 算法类似,比较简单,想清楚后很容易实现. 对于每个节点u , ancestors[u] ...

  6. Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)

    Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...

  7. POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)

    POJ 1470 Closest Common Ancestors(最近公共祖先 LCA) Description Write a program that takes as input a root ...

  8. POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)

    POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...

  9. 【洛谷 p3379】模板-最近公共祖先(图论--倍增算法求LCA)

    题目:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 解法:倍增. 1 #include<cstdio> 2 #include<cstdlib> 3 #include ...

  10. 最近公共祖先(LCA)模板

    以下转自:https://www.cnblogs.com/JVxie/p/4854719.html 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖 ...

随机推荐

  1. codeforces 652D D. Nested Segments(离散化+sort+树状数组)

    题目链接: D. Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  2. C++中函数模版和普通函数的区别

    函数模版和同名普通函数在同一个作用域中,会优先调用那个函数? 函数模型在进行调用的时候会进行严格的类型匹配,而普通函数在调用的时候,会进行函数参数类型转换(前提是自动类型转换). 调用函数模版,本质是 ...

  3. Android学习路线01

    part1:Java 1.Java基础 2.Java面向对象 3.数组与集合,异常,常用类 4.Io流 5.多线程socket编程 6.数据库,网络传输,数据解析 part2:Android 1.An ...

  4. Agc011_C Squared Graph

    传送门 题目大意 给定$n$个点$m$条边的简单图(无重边无自环),将有序点对$\{a,b\}$作为新的点,新产生的$n^2$个点中对于两个点,$\{a,b\},\{x,y\}$,当且仅当原图中存在边 ...

  5. NYOJ-括号配对问题--------待解决,RE

    描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的 ...

  6. bzoj 1355: Radio Transmission

    题目大意: 求字符串的最短循环覆盖字符串 题解: 经典结论题: kmp \(ans = n - next[n]\) #include <cstdio> #include <cstri ...

  7. [转]CSS3 Filter的十种特效

    最近到处看到有人在说CSS3的filter一直没有时间自己去测试这效果.今天终于抽出时间学习这个CSS3的Filter.不整不知道呀,一整才让我感到吃惊,太强大了.大家先来看个效果吧: 我想光看上面的 ...

  8. java代码Math.sqrt

    总结:这个判断小数的题目,当时全只2有一个人想出了结果.老师很开心.我很桑心~~~~ 我没想到要取膜,我只想到了除以等于0就够了.至于中间的“取膜”,我没凑齐来,还是不够灵活 package com. ...

  9. java代码JFrame练习

    总结: package com.da; import java.awt.Button; import java.awt.Color; import java.awt.FlowLayout; impor ...

  10. RESTEasy常用注解

    一.@Path,标注资源类或方法的相对路径          Path参数的形式有三种:          1.固定值          2.纯正则表达式          3.固定值和正则表达式的混 ...