小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水。

小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X 城时只建造 N – 1 条边,使得城市的各个地点能够相互到达。

小 X 计划蒸发 Q 天的学水,每一天会有一名学水从 A 地走到 B 地,并在沿途各个地点留下一个水塘。此后,小 X 会从 C 地走到 B 地,并用佛光蒸发沿途的水塘。由于 X 城是一个学佛横行的城市,学水留下的水塘即使没有被小 X 蒸发,也会在第二天之前被其他学佛蒸发殆尽。

现在,小 X 想要知道,他每一天能够蒸发多少水塘呢?

输入格式

第一行三个整数 N,Q,num,分别表示 X 城地点的个数,小 X 蒸发学水的天数,以及测试点编号。注意,测试点编号是为了让选手们更方便的获得部分分,你可能不需要用到这则信息,在下发的样例中,测试点编号的含义是该样例满足某一测试点限制。

接下来 N – 1 行,每行两个整数 X,Y,表示 X 地与 Y 地之间有一条边。

接下来 Q 行,每行三个整数 A,B,C,表示一天中,有一名学水从 A 地走到 B 地,而小 X 会从 C 地走到 B 地。

输出格式

输出 Q 行,每行一个整数,表示小 X 能够蒸发的水塘数。

数据规模与约定

特殊性质 1:第 i 条边连接第 i 和第 i+1 个地点。

特殊性质 2:A=C。

样例输入

  1. 3 3 1
  2. 1 2
  3. 2 3
  4. 1 2 3
  5. 1 1 3
  6. 3 1 3

样例输出

  1. 1
  2. 1
  3. 3
    A->BB->C的共同路径长为
    (LAB+LBC-LAC)/2
    不过因为是点权,所以要+1
    直接倍增LCA就行了
    不过建树不能用dfs,会溢出,要用bfs()
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<queue>
  6. using namespace std;
  7. struct Node
  8. {
  9. int next,to;
  10. }edge[];
  11. int num,head[];
  12. int n,q,dep[],fa[][];
  13. bool vis[];
  14. void add(int u,int v)
  15. {
  16. num++;
  17. edge[num].next=head[u];
  18. head[u]=num;
  19. edge[num].to=v;
  20. }
  21. void bfs()
  22. {int i;
  23. queue<int>Q;
  24. memset(vis,,sizeof(vis));
  25. dep[]=;
  26. Q.push();
  27. vis[]=;
  28. while (Q.empty()==)
  29. {
  30. int u=Q.front();
  31. Q.pop();
  32. for (i=head[u];i;i=edge[i].next)
  33. {
  34. int v=edge[i].to;
  35. if (vis[v]==)
  36. {
  37. vis[v]=;
  38. dep[v]=dep[u]+;
  39. fa[v][]=u;
  40. Q.push(v);
  41. }
  42. }
  43. }
  44. }
  45. int LCA(int x,int y)
  46. {int i;
  47. if (dep[x]<dep[y]) swap(x,y);
  48. for (i=;i>=;i--)
  49. if ((<<i)<=dep[x]-dep[y]) x=fa[x][i];
  50. if (x==y) return x;
  51. while (x!=y)
  52. {
  53. for (i=;i>=;i--)
  54. if (fa[x][i]!=fa[y][i])
  55. {
  56. x=fa[x][i];
  57. y=fa[y][i];
  58. }
  59.  
  60. if (x==y) return x;
  61. x=fa[x][];
  62. y=fa[y][];
  63. }
  64. return x;
  65. }
  66. int main()
  67. {int x,y,i,a,b,c,j;
  68. cin>>n>>q>>x;
  69. for (i=;i<=n-;i++)
  70. {
  71. scanf("%d%d",&x,&y);
  72. add(x,y);add(y,x);
  73. }
  74. bfs();
  75. for (i=;i<=n;i++)
  76. {
  77. for (j=;j<=;j++)
  78. fa[i][j]=fa[fa[i][j-]][j-];
  79. }
  80. for (i=;i<=q;i++)
  81. {
  82. scanf("%d%d%d",&a,&b,&c);
  83. int l1=LCA(a,b),l2=LCA(b,c),l3=LCA(a,c);
  84. int s1=dep[a]-dep[l1]+dep[b]-dep[l1];
  85. int s2=dep[b]-dep[l2]+dep[c]-dep[l2];
  86. int s3=dep[a]-dep[l3]+dep[c]-dep[l3];
  87. printf("%d\n",(s1+s2-s3)/+);
  88. }
  89. }

计蒜客NOIP模拟赛4 D1T3 小X的佛光的更多相关文章

  1. 计蒜客NOIP模拟赛(3)D1T3 任性的国王

    X 国的地图可以被看作一个两行 nn 列的网格状图.现在 X 国需要修建铁路,然而该国的国王非常小气,他只想保证位于某两列之间的所有城市互相可以到达就行了,在此基础上,他希望所花费的代价最小. 铁路可 ...

  2. 计蒜客NOIP模拟赛(2)D1T3 深黑幻想

    [问题描述]    凡终于发愤图强,决定专心搞OI,不再玩纸牌和坑钱了!没过多久就飘飘然了,总是陷入自己进了集训队的深黑幻想之中.    样听说了之后,决定考一考凡欧拉回路怎么写.样:“我给你出一道题 ...

  3. 计蒜客NOIP模拟赛4 D1T2小X的密室

    小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...

  4. 计蒜客NOIP模拟赛4 D1T1 小X的质数

    小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1以外,没有其他因数的数字. 但由于小 X ...

  5. 计蒜客NOIP模拟赛6 D1T1Diamond-square

    Diamond-square 算法是一种能够用于生成噪声的算法,现在我们考虑这个算法的一个变种. 你有一个 2^n\times 2^n2​n​​×2​n​​ 的网格,一共有 (2^n+1)^2(2​n ...

  6. 计蒜客NOIP模拟赛4 D2T1 鬼脚图

    鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线, ...

  7. 计蒜客 NOIP模拟赛(3) D1T1火山喷发

    火山喷发对所有附近的生物具有毁灭性的影响.在本题中,我们希望用数值来模拟这一过程. 在环境里有 nnn 个生物分别具有 A1,A2,⋯,An​​点生命值,一次火山喷发总计 M轮,每轮造成 1点伤害,等 ...

  8. 计蒜客NOIP模拟赛(2) D1T1邻家男孩

    凡是一个具有领导力的孩子.现实生活中他特别喜欢玩一个叫做 UNO 的纸牌游戏,他也总是带着其他小朋友一起玩,然后战胜他们.慢慢地,他厌倦了胜利,于是准备发明一种新的双人纸牌游戏. 初始时,每个人手中都 ...

  9. 计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi

    那年一个雨季,AmyZhi 在校门外弯身买参考书. 这时 SiriusRen 走过来,一言不合甩给她一道“自认为”很难的题: --------------- 给你一个数字 NN(NN 的范围是 11  ...

随机推荐

  1. JAVA_SE基础——64.StringBuffer类 ①

     字符串特点:字符串是常量:它们的值在创建之后不能更改 字符串的内容一旦发生了变化,那么马上会创建一个新的对象. 注意:字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象. publ ...

  2. [翻译]现代java开发指南 第三部分

    现代java开发指南 第三部分 第三部分:Web开发 第一部分,第二部分,第三部分 =========================== 欢迎来到现代 Java 开发指南第三部分.在第一部分中,我们 ...

  3. 你能选择出,前几个元素吗?使用纯css

    面试被问到 ,你能选择出前几个元素吗?括弧只能使用css 我当时是一脸懵逼... 回去的路上思考一路 终于想到了解决办法 虽然为时已晚 但是觉得很有意义... 首先要用到 否定选择器 : :not() ...

  4. ssl双向认证

    ssl双向认证 一.背景知识 1.名词解释 ca.key: 根证书的私钥 , ca.crt: 根证书的签名证书 server.key, server.crt client.key, client.cr ...

  5. Spring Security入门(3-1)Spring Security的登录页面定制

  6. VS2013 堆栈溢出调查(0xC00000FD: Stack overflow)

    在调试一个代码时,执行过程中会出现如下错误(0xC00000FD: Stack overflow). 很明显是堆栈溢出了. 网上很多方法,都是通过修改设置工程配置,把堆栈调大一些,如下图. 但是堆栈到 ...

  7. 使用TortoiseSVN打Tag

    参考了 https://blog.csdn.net/liuzx32/article/details/9123401. 值得注意的点是: 选择路径的时候,不要先点进去自己建好叶子节点路径再选择该路径,会 ...

  8. mysql批量插入语句执行失败的话,是部分失败还是全部失败

    项目开发中,正好遇到这个问题. 将一批从外部第三方接口获取到的数据存储到本地mysql数据库,假设接口返回的数据类型为A,经过A到B的转换规则转换后, 要插入数据库的数据类型为B.那么在A获取到100 ...

  9. 理解JavaScript中函数方法

    1.函数声明和函数表达式 通过字面量创建函数的方式有两种函数声明和函数表达式: 函数声明: function sum(x, y) { var result = x + y; return result ...

  10. POJ-3253 Fence Repair---Huffman贪心

    题目链接: https://vjudge.net/problem/POJ-3253 题目大意: 有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长 ...