• 洛谷 P3398 仓鼠找sugar 题解


    每日一题 day44 打卡

    Analysis

    首先有一个结论:先找 p1=(a,b),p2=(c,d) 的LCA的深度,在与(a,c),(a,d),(b,c),(b,d)中最深的LCA n的深度比较,如果 n <=p1 & n<=p2 说明两条路径相交(即满足题目要求)。

    假设 (b,c) 是最深的LCA n,  p1=dep[LCA(a,b)] .

    且 n>=p1.

    因为是树,所以每个点走到其LCA的路径只有一条。

    也就是说,n点在b到p1的路径上,即两条路径相交

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define int long long
     6 #define maxn 100000+10
     7 #define rep(i,s,e) for(register int i=s;i<=e;++i)
     8 #define dwn(i,s,e) for(register int i=s;i>=e;--i)
     9 using namespace std;
    10 inline int read()
    11 {
    12     int x=0,f=1;
    13     char c=getchar();
    14     while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}
    15     while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
    16     return f*x;
    17 }
    18 inline void write(int x)
    19 {
    20     if(x<0) {putchar('-'); x=-x;}
    21     if(x>9) write(x/10);
    22     putchar(x%10+'0');
    23 }
    24 int n,q,cnt;
    25 int dep[maxn],dp[maxn][20+1];
    26 int head[2*maxn];
    27 struct node
    28 {
    29     int v,nex;
    30 }edge[2*maxn];
    31 inline int max_four(int a1,int a2,int a3,int a4)
    32 {
    33     return max(max(a1,a2),max(a3,a4));
    34 }
    35 inline void add(int x,int y)
    36 {
    37     edge[++cnt].v=y;
    38     edge[cnt].nex=head[x];
    39     head[x]=cnt;
    40 }
    41 void init(int from,int father)
    42 {
    43     dep[from]=dep[father]+1;
    44     rep(i,1,20) dp[from][i]=dp[dp[from][i-1]][i-1];
    45     for(int i=head[from];i;i=edge[i].nex)
    46     {
    47         int to=edge[i].v;
    48         if(to==father) continue;
    49         dp[to][0]=from;
    50         init(to,from);
    51     }
    52 }
    53 int LCA(int x,int y)
    54 {
    55     if(dep[x]<dep[y]) swap(x,y);
    56     dwn(i,20,0)
    57     {
    58         if(dep[dp[x][i]]>=dep[y])
    59             x=dp[x][i];
    60         if(x==y) return x;
    61     }    
    62     dwn(i,20,0)
    63     {
    64         if(dp[x][i]!=dp[y][i])
    65         {
    66             x=dp[x][i];
    67             y=dp[y][i];
    68         }
    69     }
    70     return dp[x][0];
    71 }
    72 signed main()
    73 {
    74     n=read();q=read();
    75     rep(i,1,n-1)
    76     {
    77         int x=read(),y=read();
    78         add(x,y);
    79         add(y,x);
    80     }
    81     init(1,0);
    82     rep(i,1,q)
    83     {
    84         int a=read(),b=read(),c=read(),d=read();
    85         int p1=dep[LCA(a,b)],p2=dep[LCA(c,d)];
    86         int n1=LCA(a,c),n2=LCA(a,d),n3=LCA(b,c),n4=LCA(b,d);
    87         int com=max_four(dep[n1],dep[n2],dep[n3],dep[n4]);
    88         if(p1<=com&&p2<=com) printf("Y
    ");
    89         else printf("N
    ");
    90     }
    91     return 0;
    92 }

    请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    第十三篇:一点一滴学ibatis(二)映射文件
    第十二篇:随手记一下javaBean的setter,getter方法的命名问题
    第十一篇:一点一滴学ibatis(一)
    第十篇:javaScript中的JSON总结
    第九篇:Spring的applicationContext.xml配置总结
    第八篇:ZTree操作总结
    第六篇:fastJson常用方法总结
    第五篇:zTree节点的一些操作,权当备份
    第四篇:java读取Excel简单模板
    测试驱动android
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/11890933.html
Copyright © 2020-2023  润新知