• [日常摸鱼]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
    ");
            else printf("N
    ");
        }
        return 0;
    }
    View Code

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

  • 相关阅读:
    使用 python 实现 memcached 的启动服务脚本 rc
    iNeedle系统之国舜项目
    CentOS系统在不重启的情况下为虚拟机添加新硬盘
    Windows下常用软件工具的命令
    dpdk在虚拟机上出错处理
    Linux工具之man手册彩色页设置
    使用VIM插件ctags来阅读C代码
    Linux命令行上传文件到百度网盘
    ng-repeat 的重复问题
    python 启动简单web服务器
  • 原文地址:https://www.cnblogs.com/yoshinow2001/p/8166843.html
Copyright © 2020-2023  润新知