• 【luogu3398】 仓鼠找sugar [LCA 倍增]


    P3398 仓鼠找sugar

    询问树上a到b,c到d的两条路径是否相交

    长期不学竞赛...导致1mol的低级错误出现

    • 把f数组开为f[N][20]
    • 写错判断

    我烂了QAQ我好瘟死于低级错误久久无法判断出来

    如果两条路径相交,那么一定有一条路径的LCA在另一条路径上

    而判断一个节点x,是否在路径s-t上需要满足如下几个条件

        - deep[x]>=deep[LCA(s,t)]
    
        - LCA(s,x)=x或LCA(t,x)=x;
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=100000+5,inf=0x3f3f3f3f;
     5 int n,q,f[N][30],dep[N];
     6 bool vis[N];
     7 template<class t>void rd(t &x){
     8     x=0;int w=0;char ch=0;
     9     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    10     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    11     x=w?-x:x;
    12 }
    13 
    14 int head[N],tot=0;
    15 struct edge{int v,nxt;}e[N<<1];
    16 void add(int u,int v){
    17     e[++tot]=(edge){v,head[u]};head[u]=tot;
    18 }
    19 
    20 void dfs(int u,int fa){
    21     dep[u]=dep[fa]+1;
    22     f[u][0]=fa;
    23     for(int i=1;i<=20;++i){
    24         if(dep[u]<(1<<i)) break;
    25         f[u][i]=f[f[u][i-1]][i-1];
    26     }
    27     for(int i=head[u];i;i=e[i].nxt){
    28         if(e[i].v==fa) continue;
    29         dfs(e[i].v,u);
    30     }
    31 }
    32 
    33 int LCA(int a,int b){
    34     if(dep[a]>dep[b]) swap(a,b);
    35     for(int i=20;i>=0;--i){
    36         if(dep[f[b][i]]<dep[a]) continue;
    37         b=f[b][i];
    38     }
    39     if(b==a) return a;
    40     for(int i=20;i>=0;--i){
    41         if(f[a][i]==f[b][i]) continue;
    42         a=f[a][i],b=f[b][i];
    43     }
    44     return f[a][0];
    45 }
    46 
    47 
    48 int main(){
    49     freopen("in.txt","r",stdin);
    50     memset(dep,0,sizeof(dep));
    51     dep[0]=-1;
    52     rd(n),rd(q);
    53     for(int i=1,u,v;i<n;++i) rd(u),rd(v),add(u,v),add(v,u);
    54     dfs(1,0);
    55     for(int i=1,a,b,c,d,x,y;i<=q;++i){
    56         rd(a),rd(b),rd(c),rd(d);
    57         x=LCA(a,b),y=LCA(c,d);
    58         if(dep[x]<dep[y]) swap(x,y),swap(a,c),swap(b,d);
    59         if(LCA(x,c)==x||LCA(x,d)==x) printf("Y
    ");
    60         else printf("N
    ");
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    sql语句查询结果排序
    Spring MVC 注解
    Spring MVC 编程流程步骤
    菜鸟学自动化测试(一)—-selenium IDE
    list和set的区别
    Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
    是否可以从一个static方法内部发出对非static方法的调用?
    Shiro运行原理?
    shiro有哪些组件?
    简述Shiro的核心组件?
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11156365.html
Copyright © 2020-2023  润新知