洛谷 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\n");
89         else printf("N\n");
90     }
91     return 0;
92 }

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

posted @ 2019-11-19 17:33  handsome_zyc  阅读(175)  评论(0)    收藏  举报