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

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

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

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
int n,q,hd[N],xnt,nxt[N<<],to[N<<],tim,top[N],fa[N],siz[N],son[N],dep[N],rnk[N];
int ls[N<<],rs[N<<],val[N<<],laz[N<<];
int rdn()
{
int ret=;char ch=getchar();
while(ch>''||ch<'')ch=getchar();
while(ch>=''&&ch<='')(ret*=)+=ch-'',ch=getchar();
return ret;
}
void add(int x,int y)
{
to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;
to[++xnt]=x;nxt[xnt]=hd[y];hd[y]=xnt;
}
void dfs(int cr,int f)
{
fa[cr]=f;dep[cr]=dep[f]+;siz[cr]=;
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=f)
{
dfs(v,cr);siz[cr]+=siz[v];
if(siz[v]>siz[son[cr]])son[cr]=v;
}
}
void dfs(int cr)
{
rnk[cr]=++tim;
if(son[cr])top[son[cr]]=top[cr],dfs(son[cr]);
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=fa[cr]&&v!=son[cr])
{top[v]=v;dfs(v);}
}
void build(int l,int r,int cr)
{
val[cr]=N;laz[cr]=N;
if(l==r)return;int mid=l+r>>;
ls[cr]=++tim;build(l,mid,ls[cr]);
rs[cr]=++tim;build(mid+,r,rs[cr]);
}
void pshd(int cr)
{
if(laz[cr]==N)return;
laz[ls[cr]]=laz[rs[cr]]=val[ls[cr]]=val[rs[cr]]=laz[cr];
laz[cr]=N;
}
void pshp(int cr)
{
val[cr]=min(val[ls[cr]],val[rs[cr]]);
}
void mdfy(int l,int r,int cr,int L,int R,int w)
{
// printf("mdfy L=%d R=%d l=%d r=%d val=%d w=%d\n",L,R,l,r,val[cr],w);
if(l>=L&&r<=R){val[cr]=laz[cr]=w;return;}
int mid=l+r>>;pshd(cr);
if(L<=mid)mdfy(l,mid,ls[cr],L,R,w);
if(mid<R)mdfy(mid+,r,rs[cr],L,R,w);
pshp(cr);
}
void mdfy(int a,int b,int w)
{
while(top[a]!=top[b])
{
if(dep[top[a]]>dep[top[b]])swap(a,b);
mdfy(,n,,rnk[top[b]],rnk[b],w);b=fa[top[b]];
}
if(dep[a]>dep[b])swap(a,b);
mdfy(,n,,rnk[a],rnk[b],w);
}
bool query(int l,int r,int cr,int L,int R)
{
// printf("query L=%d R=%d l=%d r=%d val=%d laz=%d\n",L,R,l,r,val[cr],laz[cr]);
if(l>=L&&r<=R)return val[cr]==q;
int mid=l+r>>;pshd(cr);
bool ret=;
if(L<=mid)ret|=query(l,mid,ls[cr],L,R);
if(mid<R)ret|=query(mid+,r,rs[cr],L,R);
return ret;
}
bool query(int a,int b)
{
bool ret=;
while(top[a]!=top[b])
{
if(dep[top[a]]>dep[top[b]])swap(a,b);
ret|=query(,n,,rnk[top[b]],rnk[b]);b=fa[top[b]];
}
if(dep[a]>dep[b])swap(a,b);
ret|=query(,n,,rnk[a],rnk[b]);
return ret;
}
int main()
{
n=rdn();q=rdn();int a,b,c,d;
for(int i=;i<n;i++)
{
a=rdn();b=rdn();add(a,b);
}
dfs(,);top[]=;dfs();
tim=;val[]=N;build(,n,);
while(q--)
{
// printf("q=%d\n",q);
a=rdn();b=rdn();c=rdn();d=rdn();
mdfy(a,b,q);
if(query(c,d))puts("Y");else puts("N");
}
return ;
}

洛谷 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. Python学习day40-并发编程(终)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  2. python格式化输出%,while else

    一.格式化输出% 需求:自我介绍模板 #格式化输出 # % s d %占位符,占个位置 s(字符串),d(数字)替换内容的类型 name = input('请输入姓名:') age = input(' ...

  3. 【51nod 1355】 斐波那契数的最小公倍数

    题目 51nod的数学题都还不错啊 首先直接算显然是没有办法算的,因为\(fib\)的lcm这个东西还是太鬼畜了 我们考虑到\(fib\)数列的一个非常好的性质是\(gcd(fib_i,fib_{j} ...

  4. js for in 和 for of 的区别

    引自:http://es6.ruanyifeng.com/#docs/iterator for...of循环可以代替数组实例的forEach方法. const arr = ['red', 'green ...

  5. elasticsearch 中文API 索引(三)

    索引API 索引API允许开发者索引类型化的JSON文档到一个特定的索引,使其可以被搜索. 生成JSON文档 有几种不同的方式生成JSON文档 利用byte[]或者作为一个String手动生成 利用一 ...

  6. mysql-connector-java-8.0.12使用时报错

    配置url加 &useSSL=false&serverTimezone=UTC 就可以了

  7. Selenium浏览器自动化测试使用(1)

    Selenium - 介绍 Selenium是一个开源的和便携式的自动化软件测试工具,用于测试Web应用程序有能力在不同的浏览器和操作系统运行.Selenium真的不是一个单一的工具,而是一套工具,帮 ...

  8. C#(.net)中的DllImport

    大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能 ...

  9. hammer.js使用

    手势包括点击(tap),长按(press),滑动(swipe),方向(pan) 使用实例: <!DOCTYPE html> <html> <head> <me ...

  10. LUOGU P4074 [WC2013]糖果公园 (树上带修莫队)

    传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...