传送门

多组询问,问到树上两个点x,y距离相等的点的个数。

倍增求lca.

  1. //Twenty
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<cmath>
  7. #include<cstring>
  8. #include<queue>
  9. #include<vector>
  10. #include<ctime>
  11. const int maxn=1e5+;
  12. typedef long long LL;
  13. using namespace std;
  14. int n,m,ecnt,fir[maxn],nxt[maxn<<],to[maxn<<],f[maxn][],R[maxn],sz[maxn];;
  15. void add(int u,int v) {
  16. nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
  17. nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
  18. }
  19. void dfs(int x,int fa) {
  20. R[x]=R[fa]+;
  21. f[x][]=fa;
  22. sz[x]=;
  23. for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa) {
  24. dfs(to[i],x);
  25. sz[x]+=sz[to[i]];
  26. }
  27. }
  28. void make_st() {
  29. for(int i=;i<=;i++)
  30. for(int j=;j<=n;j++)
  31. f[j][i]=f[f[j][i-]][i-];
  32. }
  33. int lca(int x,int y) {
  34. if(R[x]<R[y]) swap(x,y);
  35. for(int i=;i>=;i--)
  36. if(R[f[x][i]]>=R[y]) x=f[x][i];
  37. if(x==y) return x;
  38. for(int i=;i>=;i--)
  39. if(f[x][i]!=f[y][i]) {
  40. x=f[x][i];
  41. y=f[y][i];
  42. }
  43. return f[x][];
  44. }
  45. int cal(int x,int y) {
  46. if(x==y) return sz[];
  47. int z=lca(x,y);
  48. if(R[x]==R[y]) {
  49. for(int i=;i>=;i--)
  50. if(f[x][i]!=f[y][i]) {
  51. x=f[x][i];
  52. y=f[y][i];
  53. }
  54. return sz[]-sz[x]-sz[y];
  55. }
  56. int l=R[x]-R[z]+R[y]-R[z];
  57. if(l&) return ; l>>=;
  58. if(R[x]<R[y]) swap(x,y);
  59. l=R[x]-R[z]-l+;
  60. for(int i=;i>=;i--)
  61. if(R[f[x][i]]&&R[f[x][i]]-R[z]>=l)
  62. x=f[x][i];
  63. return sz[f[x][]]-sz[x];
  64. }
  65. int main()
  66. {
  67. scanf("%d",&n);
  68. for(int i=;i<n;i++) {
  69. int x,y;
  70. scanf("%d%d",&x,&y);
  71. add(x,y);
  72. }
  73. dfs(,);
  74. make_st();
  75. scanf("%d",&m);
  76. for(int i=;i<=m;i++) {
  77. int x,y;
  78. scanf("%d%d",&x,&y);
  79. printf("%d\n",cal(x,y));
  80. }
  81. return ;
  82. }

cf519E的更多相关文章

  1. CF519E A and B and Lecture Rooms

    最近很颓……难题想不动……水题写不对,NOIP怕是

随机推荐

  1. AmqpException: No method found for class java.lang.String

    amqpTemplate发送消息用的String,接收消息用的Message,统一消息类型就可以

  2. javascript和jquery

    JavaScript 1.概述 JavaScript是一种基于对象和事件驱动,并具有安全性能的脚本语言. 2.语法 HTML 中的脚本必须位于 <script> 与 </script ...

  3. 运维人员最常用150个linux命令汇总

    命令 功能说明 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作命令(18个) l ...

  4. "一个实用的却被忽略的命名空间:Microsoft.VisualBasic":

        当你看到这个命名空间的时候,别因为是vb的东西就匆忙关掉网页,那将会是您的损失,此命名空间中的资源最初目的是为了简化vb.net开发而创建的,所以microsoft.visualbasic并不 ...

  5. (34)C#异常

    一.异常的层次结构 二.异常格式 异常的一般格式 try { //可能会抛出异常的代码 } catch { //发现错误后会运行这里面的代码 } finally { //写不论是否出现异常都执行的代码 ...

  6. 多进程并发socket通信

    实现多个客户端同时接入server端,并且可以同时向客户端发送信息 server端 def dunc(conn,client_addr): while True: data=conn.recv(102 ...

  7. Vue .sync修饰符与$emit(update:xxx)写法问题

    在学习vue自定义事件的.sync修饰符实现改变数值时发现一个问题如下由于props的大小写命名:fatherNum,对应不同的$emit()会有不同的效果,具体如下: 使用.sync修饰符,即 // ...

  8. 10_springmvc JSON数据交互

    一.JSON数据交互 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便.比如:webservice接口,传输json数据. 二.springmvc进行数据交互 ...

  9. Django杂篇(2)

    目录 Django杂篇(2) cookie与session cookie session django中间件 自定义中间件 跨站请求伪造(csrf) CSRF的解决方案 Django杂篇(2) 本文主 ...

  10. java_网络编程之上传文件案例

    初期成果: 客户端: package FileUpload; import java.io.*; import java.net.Socket; import java.util.Scanner; p ...