[日常摸鱼]luogu3398仓鼠找sugar-树链剖分

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

题意:一颗$n$个点的树,$q$次询问两条链$(a,b),(c,d)$是否有交



树剖裸题orz

一开始的想法是求出$lca_1=lca(a,b),lca_2=lca(c,d)$,对于深度大的那个$lca$用dfs序判断是否在另一条链上,然后到现在都不知道为什么一直wa…

改成判断深度大的那个$lca$是否和另外两个点的其中某个点有父子关系好像就行了…

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
inline int read()
{
    int s=0,f=1;char c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){s=s*10+c-‘0‘;c=getchar();}
    return s*f;
}
struct edge
{
    int to,nxt;
}edges[N<<1];
int n,q,tot,cnt;
int head[N<<1],size[N],son[N],dep[N],top[N],fa[N],tim[N];

inline void addEdge(int u,int v)
{
    edges[++cnt]=(edge){v,head[u]};
    head[u]=cnt;
}

#define cur edges[i].to

inline void dfs1(int x)
{
    size[x]=1;
    for(register int i=head[x];i;i=edges[i].nxt)
        if(cur!=fa[x])
        {
            fa[cur]=x;dep[cur]=dep[x]+1;
            dfs1(cur);size[x]+=size[cur];
            if(size[son[x]]<size[cur])son[x]=cur;
        }
}

inline void dfs2(int x,int t)
{
    top[x]=t;tim[x]=++tot;
    if(son[x])dfs2(son[x],t);
    for(register int i=head[x];i;i=edges[i].nxt)
        if(cur!=son[x]&&cur!=fa[x])dfs2(cur,cur);
}

#undef cur

inline int lca(int a,int b)
{
    while(top[a]!=top[b])
    {
        if(dep[top[a]]<dep[top[b]])swap(a,b);
        a=fa[top[a]];
    }
    if(dep[a]>dep[b])swap(a,b);
    return a;
}

int main()
{
    n=read();q=read();
    for(register int i=1;i<n;i++)
    {
        int u,v;u=read();v=read();
        addEdge(u,v);addEdge(v,u);
    }
    dfs1(1);dfs2(1,1);

    for(register int i=1;i<=q;i++)
    {
        int a,b,c,d,lca1,lca2,res;
        a=read();b=read();c=read();d=read();
        lca1=lca(a,b);lca2=lca(c,d);
        if(dep[lca1]<dep[lca2])
        {
            swap(lca1,lca2);
            swap(a,c);
            swap(b,d);
        }
        if(lca(lca1,c)==lca1||lca(lca1,d)==lca1)res=1;
        else res=0;

        if(res)printf("Y\n");
        else printf("N\n");
    }
    return 0;
}

如果有人知道一开始的方法为什么错了请务必告诉我orz

原文地址:https://www.cnblogs.com/yoooshinow/p/8166843.html

时间: 2024-10-03 18:42:35

[日常摸鱼]luogu3398仓鼠找sugar-树链剖分的相关文章

luogu3398 仓鼠找sugar

题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d).他们都会走最短路径.现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? 小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧! 输入输出格式 输入格式: 第一行两个正整数n和q,表示这棵树节点的个数和询问的个数. 接下来n-1行,每行两个正整数u和v,表示节点u到节点v之

[日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法

关于自适应Simpson法的介绍可以去看我的另一篇blog http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题意:空间里圆心在同一直线上且底面与地面平行的若干个圆台和顶层的圆锥以$\alpha$的角度投影到地面,求投影的面积. (其实我是看po姐博客来的x) 首先把圆锥的顶点也看成一个半径为0的圆满,对于每个高度为$h$的圆投影下去的坐标是$h/tan(\alpha)$,半径不变,而对于圆台的侧面投影下去是上下底两个圆的切线. 关于两个圆

[日常摸鱼][poj2777]Count Color-线段树

辣鸡会考考完啦哈哈哈哈 题意:一块板分成$L$块,每次给一段连续的块染色或者询问一段有几种颜色,颜色的范围$\leq 30$ 我记得我好像做过一个类似的二维染色的问题-不过那个用树状数组直接过掉了- 这题颜色范围这么小的范围直接想到线段树了吧,直接把一个区间的颜色二进制按位压缩成一个状态,维护区间或 题面还特地说了可能$a>b$-然而我没看到 #include<cstdio> const int N=100005; inline int read() { int s=0,f=1;char

【Luogu3398】仓鼠找sugar(树链剖分)

[Luogu3398]仓鼠找sugar(树链剖分) 题面 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d).他们都会走最短路径.现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? 小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧! 输入输出格式 输入格式: 第一行两个正整数n和q,表示这棵树节点的个数和询问的个数.

P3398 仓鼠找sugar(树链剖分)

P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d).他们都会走最短路径.现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? 小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧! 输入输出格式 输入格式: 第一行两个正整数n和q,表示这棵树节点的个数和询问的个数. 接下来n-1行,每行两个正整

洛谷 P3398 仓鼠找sugar

P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d).他们都会走最短路径.现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? 小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧! 输入输出格式 输入格式: 第一行两个正整数n和q,表示这棵树节点的个数和询问的个数. 接下来n-1行,每行两个正整

仓鼠找sugar(lca)

洛谷——P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d).他们都会走最短路径.现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? 小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧! 输入输出格式 输入格式: 第一行两个正整数n和q,表示这棵树节点的个数和询问的个数. 接下来n-1行,每行

luogu P3398 仓鼠找sugar x

P3398 仓鼠找sugar 224通过 860提交 题目提供者 fjzzq2002 标签 云端↑ 难度 提高+/省选- 时空限制 1s / 128MB 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d).他们都会走最短路径.现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? 小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救

Luogu P3412 仓鼠找$sugar$ $II$

Luogu P3412 仓鼠找\(sugar\) \(II\) 题目大意: 给定一棵\(n\)个点的树, 仓鼠每次移动都会等概率选择一个与当前点相邻的点,并移动到此点. 现在随机生成一个起点.一个终点(可能相同). 仓鼠希望知道它从起点走到终点的期望步数是多少. 数据范围: 对于\(30\%\),\(n\leq 5\) 对于\(60\%\),\(n\leq 5\times 10^3\) 对于\(100\%\),\(n \leq 7\times 10^6\) 请将输出答案(一个分数)模上\(998