题目

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


分析

有公共点当且仅当一条路径的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. AirtestProject浅尝辄止

    AirtestProject是什么 AirtestProject是由网易游戏推出的UI自动化测试解决方案,主要包含3部分内容: 1.Airtest框架:跨平台的,基于图像识别的UI自动化测试框架,支持 ...

  2. Excelize 开源基础发布 2.8.1 版本,2024 年首个更新

    Excelize 是 Go 语言编写的用于操作电子表格办公文档的开源基础库,基于 ISO/IEC 29500.ECMA-376 国际标准.可以使用它来读取.写入由 Microsoft Excel.WP ...

  3. Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC

    前言   前面烧写一直时烧写进入flush,是按照分区烧写.定制的板子挂的是eMMC,前面的烧写步骤一致,但是在烧写目标则时烧写eMMC了.  重新走一遍从无到有通过网口刷定制板卡的uboot.ker ...

  4. Go语言的100个错误使用场景(55-60)|并发基础

    目录 前言 8. 并发基础 8.1 混淆并发与并行的概念(#55) 8.2 认为并发总是更快(#56) 8.3 分不清何时使用互斥锁或 channel(#57) 8.4 不理解竞态问题(#58) 8. ...

  5. Volatile关键字原理

    转载请标明:https://www.cnblogs.com/tangZH/p/15113505.html 一.如果一个变量被volatile关键字修饰,那么所有线程都是可见的.所谓可见就是,当一条线程 ...

  6. Python-Json异常:Object of type Decimal is not JSON serializable

    源起: 使用python分离出一串文本,因为是看起来像整数,结果json转换时发生异常:TypeError: Object of type Decimal is not JSON serializab ...

  7. 新零售SaaS架构:订单履约系统架构设计(万字图文总结)

    什么是订单履约系统? 订单履约系统用来管理从接收客户订单到将商品送达客户手中的全过程. 它连接了上游交易(客户在销售平台下单环)和下游仓储配送(如库存管理.物流配送),确保信息流顺畅.操作协同,提升整 ...

  8. Codeforces Round 651 (Div. 2)C. Number Game(数学思维数论)

    C. Number Game 我们考虑那些状态是必胜态 我的回合时n为奇数(除1外),直接除以n则必胜 下面偶数的情况稍复杂 偶数我们能进行的操作只有除以一个奇数,需要考虑怎么把当前状态变为对手的必败 ...

  9. liquibase customChange

    liquibase customChange liquibase changeset 执行Java代码. liquibase支持yml等文件,支持引入sql文件,还支持Java这种方式执行change ...

  10. 3DES算法的起源与演进:保障信息安全的重要里程碑

    一.3DES算法的起源与演进 3DES算法是DES算法的增强版,由IBM公司在上世纪90年代初提出.DES算法的密钥长度只有56位,随着计算机计算能力的提升,其安全性逐渐受到威胁.为了增强数据的安全性 ...