题目

多次询问求树上的两条路径是否有公共点


分析

有公共点当且仅当一条路径的LCA在另一条路径上,

否则一定会形成一个环,那树剖求LCA判断一下LCA是否在另一条路径上即可


代码

  1. #include <cstdio>
  2. #include <cctype>
  3. #define rr register
  4. using namespace std;
  5. const int N=100101;
  6. struct node{int y,next;}e[N<<1];
  7. int k=1,n,as[N],fat[N],dep[N],tot;
  8. int son[N],dfn[N],top[N],big[N],m;
  9. inline signed iut(){
  10. rr int ans=0; rr char c=getchar();
  11. while (!isdigit(c)) c=getchar();
  12. while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
  13. return ans;
  14. }
  15. inline void print(int ans){
  16. if (ans>9) print(ans/10);
  17. putchar(ans%10+48);
  18. }
  19. inline void dfs1(int x,int fa){
  20. dep[x]=dep[fa]+1,fat[x]=fa,son[x]=1;
  21. for (rr int i=as[x],mson=-1;i;i=e[i].next)
  22. if (e[i].y!=fa){
  23. dfs1(e[i].y,x);
  24. son[x]+=son[e[i].y];
  25. if (son[e[i].y]>mson) big[x]=e[i].y,mson=son[e[i].y];
  26. }
  27. }
  28. inline void dfs2(int x,int linp){
  29. dfn[x]=++tot,top[x]=linp;
  30. if (!big[x]) return; dfs2(big[x],linp);
  31. for (rr int i=as[x];i;i=e[i].next)
  32. if (e[i].y!=fat[x]&&e[i].y!=big[x])
  33. dfs2(e[i].y,e[i].y);
  34. }
  35. inline signed lca(int x,int y){
  36. while (top[x]!=top[y]){
  37. if (dep[top[x]]<dep[top[y]]) x^=y,y^=x,x^=y;
  38. x=fat[top[x]];
  39. }
  40. if (dep[x]>dep[y]) x^=y,y^=x,x^=y;
  41. return x;
  42. }
  43. inline signed dist(int x,int y){
  44. rr int LCA=lca(x,y);
  45. return dep[x]+dep[y]-2*dep[LCA];
  46. }
  47. signed main(){
  48. n=iut(); m=iut();
  49. for (rr int i=1;i<n;++i){
  50. rr int x=iut(),y=iut();
  51. e[++k]=(node){y,as[x]},as[x]=k,
  52. e[++k]=(node){x,as[y]},as[y]=k;
  53. }
  54. dfs1(1,0),dfs2(1,0);
  55. for (rr int i=1;i<=m;++i,putchar(10)){
  56. rr int lx=iut(),ly=iut(),rx=iut(),ry=iut();
  57. rr int lcal=lca(lx,ly),lcar=lca(rx,ry);
  58. if (dist(lx,lcar)+dist(lcar,ly)==dist(lx,ly)){
  59. putchar('Y'); continue;
  60. }
  61. if (dist(rx,lcal)+dist(ry,lcal)==dist(rx,ry)){
  62. putchar('Y'); continue;
  63. }
  64. putchar('N');
  65. }
  66. return 0;
  67. }

#树链剖分,LCA#洛谷 3398 仓鼠找sugar的更多相关文章

  1. 洛谷 3398 仓鼠找sugar——树链剖分

    题目:https://www.luogu.org/problemnew/show/P3398 原来只要把值记录成第几次就行了. 别忘了while(top[a]!=top[b])之后还要走一步. #in ...

  2. 洛谷 3398 仓鼠找sugar 【模板】判断树上两链有交

    [题解] 题意就是判断树上两条链是否有交.口诀是“判有交,此链有彼祖”.即其中一条链的端点的Lca在另一条链上. 我们设两条链的端点的Lca中深度较大的为L2,对L2与另一条链的两个端点分别求Lca, ...

  3. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  4. 【树链剖分】洛谷P3379 树链剖分求LCA

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

  5. 洛谷 P3398 仓鼠找sugar —— 树链剖分

    题目:https://www.luogu.org/problemnew/show/P3398 树链剖分一下,路径就变成线段树上的几个区间: 两条路径相交就是线段树上有区间相交,所以在相应位置打个标记, ...

  6. 洛谷P3398 仓鼠找sugar [LCA]

    题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  7. 洛谷 P3398 仓鼠找sugar 解题报告

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  8. 树链剖分模板(洛谷P3384)

    洛谷P3384 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " < ...

  9. 洛谷 [P3398] 仓鼠找sugar

    树剖求LCA 我们可以发现,两条路径ab,cd相交,当且仅当 dep[lca(a,b)]>=dep[lca(c,d)]&(lca(lca(a,b),c)==lca(a,b)||lca(l ...

  10. 树链剖分( 洛谷P3384 )

    我们有时候遇到这样一类题目,让我们维护树上路径的某些信息,这个时候发现我们无法用线段树或者树状数组来维护这些信息,那么我们就有着一种新的数据结构,树剖:将一棵树划分成若干条链,用数据结构去维护每条链, ...

随机推荐

  1. 通过paramiko模块操作服务器

    用于帮助开发者通过代码远程连接服务器,并对服务器进行操作. 如果下面运行错误了,可以看我另外一篇文章有解决办法解决paramiko连接远程服务器错误 pip3 install paramiko imp ...

  2. 问题解决:由于找不到msvcr110.dll,无法继续执行代码

    报错 解决 下载地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=30679

  3. cpu过高什么原因?怎么排查?

    运行大型程序或应用程序:当计算机运行大型程序或应用程序时,CPU需要处理更多的数据和指令,因此CPU占用率会相应地增加. 病毒或恶意软件:某些病毒或恶意软件会占用计算机的CPU资源来执行恶意任务,例如 ...

  4. Kali 获取任意设备信息

    注意:仅供测试 请勿商用 可获取对方位置 误差小于500m 访问摄像头 访问麦克风 一. 安装环境 #01 mac 安装虚拟机 下载地址:https://www.macyy.cn/archives/1 ...

  5. 巧用SQL语句中的OR查询完成业务新需求-2022新项目

    一.业务场景 目前参与开发的项目,之前的一个已上线的版本中有一类查询是根据两张表进行LEFT JOIN查询用来取数据, 主表中有一个字段field用来区分不同的数据类型比如说A/B/C.前面的版本中只 ...

  6. npm-links - 查看项目依赖包 - vscode 插件

    npm-links 依赖包相关快捷链接

  7. 让 js 失效 Chrome F12 右上角 settings - Preferences - Debugger - Disable JavaScript

    说的可能比较长,实际上,F12 右上角 - 右小角 还是挺好找的.

  8. SourceTree 摘樱桃 === 遴选 [不要使用这个功能!!不要使用!不要使用!]

    SourceTree 摘樱桃 === 遴选 不要使用摘樱桃!!不要使用!不要使用! 我找了一个文本的git,进行的测试,发现很不好用,文档我又恢复过来了,因为就改了几个字,代码的话,会造成 不可挽回的 ...

  9. PV的回收策略、访问策略和状态

    PersistentVolume(PV)的回收策略.访问策略和状态是Kubernetes存储管理中的重要概念. 回收策略 Retain:当PV的回收策略设置为Retain时,即使对应的Persiste ...

  10. float、double的精度、范围,在内存中的存储方式

    float.double的精度,在内存中的存储方式 一.浮点型变量在内存中的存储方式 Java的浮点数遵循IEEE 754标准,采用二进制数据的科学计数法来表示浮点数,float遵从的是IEEE R3 ...