题目:https://www.luogu.org/problemnew/show/P3398

原来只要把值记录成第几次就行了。

别忘了while(top[a]!=top[b])之后还要走一步。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=1e5+;
  7. int n,q,hd[N],xnt,nxt[N<<],to[N<<],tim,top[N],fa[N],siz[N],son[N],dep[N],rnk[N];
  8. int ls[N<<],rs[N<<],val[N<<],laz[N<<];
  9. int rdn()
  10. {
  11. int ret=;char ch=getchar();
  12. while(ch>''||ch<'')ch=getchar();
  13. while(ch>=''&&ch<='')(ret*=)+=ch-'',ch=getchar();
  14. return ret;
  15. }
  16. void add(int x,int y)
  17. {
  18. to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;
  19. to[++xnt]=x;nxt[xnt]=hd[y];hd[y]=xnt;
  20. }
  21. void dfs(int cr,int f)
  22. {
  23. fa[cr]=f;dep[cr]=dep[f]+;siz[cr]=;
  24. for(int i=hd[cr],v;i;i=nxt[i])
  25. if((v=to[i])!=f)
  26. {
  27. dfs(v,cr);siz[cr]+=siz[v];
  28. if(siz[v]>siz[son[cr]])son[cr]=v;
  29. }
  30. }
  31. void dfs(int cr)
  32. {
  33. rnk[cr]=++tim;
  34. if(son[cr])top[son[cr]]=top[cr],dfs(son[cr]);
  35. for(int i=hd[cr],v;i;i=nxt[i])
  36. if((v=to[i])!=fa[cr]&&v!=son[cr])
  37. {top[v]=v;dfs(v);}
  38. }
  39. void build(int l,int r,int cr)
  40. {
  41. val[cr]=N;laz[cr]=N;
  42. if(l==r)return;int mid=l+r>>;
  43. ls[cr]=++tim;build(l,mid,ls[cr]);
  44. rs[cr]=++tim;build(mid+,r,rs[cr]);
  45. }
  46. void pshd(int cr)
  47. {
  48. if(laz[cr]==N)return;
  49. laz[ls[cr]]=laz[rs[cr]]=val[ls[cr]]=val[rs[cr]]=laz[cr];
  50. laz[cr]=N;
  51. }
  52. void pshp(int cr)
  53. {
  54. val[cr]=min(val[ls[cr]],val[rs[cr]]);
  55. }
  56. void mdfy(int l,int r,int cr,int L,int R,int w)
  57. {
  58. // printf("mdfy L=%d R=%d l=%d r=%d val=%d w=%d\n",L,R,l,r,val[cr],w);
  59. if(l>=L&&r<=R){val[cr]=laz[cr]=w;return;}
  60. int mid=l+r>>;pshd(cr);
  61. if(L<=mid)mdfy(l,mid,ls[cr],L,R,w);
  62. if(mid<R)mdfy(mid+,r,rs[cr],L,R,w);
  63. pshp(cr);
  64. }
  65. void mdfy(int a,int b,int w)
  66. {
  67. while(top[a]!=top[b])
  68. {
  69. if(dep[top[a]]>dep[top[b]])swap(a,b);
  70. mdfy(,n,,rnk[top[b]],rnk[b],w);b=fa[top[b]];
  71. }
  72. if(dep[a]>dep[b])swap(a,b);
  73. mdfy(,n,,rnk[a],rnk[b],w);
  74. }
  75. bool query(int l,int r,int cr,int L,int R)
  76. {
  77. // printf("query L=%d R=%d l=%d r=%d val=%d laz=%d\n",L,R,l,r,val[cr],laz[cr]);
  78. if(l>=L&&r<=R)return val[cr]==q;
  79. int mid=l+r>>;pshd(cr);
  80. bool ret=;
  81. if(L<=mid)ret|=query(l,mid,ls[cr],L,R);
  82. if(mid<R)ret|=query(mid+,r,rs[cr],L,R);
  83. return ret;
  84. }
  85. bool query(int a,int b)
  86. {
  87. bool ret=;
  88. while(top[a]!=top[b])
  89. {
  90. if(dep[top[a]]>dep[top[b]])swap(a,b);
  91. ret|=query(,n,,rnk[top[b]],rnk[b]);b=fa[top[b]];
  92. }
  93. if(dep[a]>dep[b])swap(a,b);
  94. ret|=query(,n,,rnk[a],rnk[b]);
  95. return ret;
  96. }
  97. int main()
  98. {
  99. n=rdn();q=rdn();int a,b,c,d;
  100. for(int i=;i<n;i++)
  101. {
  102. a=rdn();b=rdn();add(a,b);
  103. }
  104. dfs(,);top[]=;dfs();
  105. tim=;val[]=N;build(,n,);
  106. while(q--)
  107. {
  108. // printf("q=%d\n",q);
  109. a=rdn();b=rdn();c=rdn();d=rdn();
  110. mdfy(a,b,q);
  111. if(query(c,d))puts("Y");else puts("N");
  112. }
  113. return ;
  114. }

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

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

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

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

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

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

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

  4. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  5. 洛谷p3384【模板】树链剖分题解

    洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...

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

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

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

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

  8. 洛谷 P3384 【模板】树链剖分

    树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...

  9. 洛谷P3178 树上操作 [HAOI2015] 树链剖分

    正解:树链剖分+线段树 解题报告: 传送门! 树链剖分+线段树算是基操了趴,,, 就无脑码码码,没有任何含金量,不需要动脑子,然后码量其实也不大,就很爽 比树剖的板子还要板子一些hhhhh 放下代码就 ...

随机推荐

  1. 数据库备份还原——mysqlbackup与mysqldump对比测试

    1      环境描述 1.1      硬件环境 服务器类型:华为RH5885 IP: 10.148.128.100 内存: 64G 物理CPU个数:4 CPU核数:8 逻辑CPU个数:64 Int ...

  2. 引用不了XXservice,怎么办?

    1.tEdasArchiveLogService = (TEdasArchiveLogService) SpringContextHolder.getBean("TEdasArchiveLo ...

  3. 从0开始学习ssh之basedao

    用于所有dao里边会有许多相同的方法,例如save,update等等.应此设计一个basedao,所有dao都继承它.这样可以省去许多工作量. basedao如下 package cn.itcast. ...

  4. NoSQL 列族数据库

  5. [转]iMPACT Spartan-6 FPGA - "WARNING:iMPACT:2217-Error shows in the status register, CRC Error bit is Not 0"

    AR# 45304 iMPACT Spartan-6 FPGA - "WARNING:iMPACT:2217-Error shows in the status register, CRC ...

  6. etcd 研究研究

    先记录参考信息:etcd 场景https://blog.csdn.net/bbwangj/article/details/82584988 etcd 集群部署https://www.jianshu.c ...

  7. js笔试-接收get请求参数

    请编写一个JavaScript函数,它的用途是接收url中get请求的参数,并返回为对象, 如: var url = “https://i.cnblogs.com/EditPosts.aspx?opt ...

  8. PAT甲级——A1029 Median

    Given an increasing sequence S of N integers, the median is the number at the middle position. For e ...

  9. Django项目: 6.新闻详情页

    一.功能需求分析 1.功能 新闻详情 加载评论功能 添加评论功能 二.新闻详情页 1.业务流程分析 业务流程: 判断前端传递新闻id是否为空,是否为整数,是否存在 2.接口设计 接口说明: 类目 说明 ...

  10. 2019-8-31-dotnet-获取用户设备安装了哪些-.NET-Framework-框架

    title author date CreateTime categories dotnet 获取用户设备安装了哪些 .NET Framework 框架 lindexi 2019-08-31 16:5 ...