每日一题 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 }
请各位大佬斧正(反正我不认识斧正是什么意思)