[CF1304E] 1-Trees and Queries - LCA
Posted mollnn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF1304E] 1-Trees and Queries - LCA相关的知识,希望对你有一定的参考价值。
由于可以走重边,所以任意一条路径长 + 2 仍然对应至少一条合法路径
很显然我们有 (3) 种基本路径
不经过 ((x,y))
经过 (x o y)
经过 (y o x)
假设某个基本路径的答案是 (d),询问是 (k),如果同时满足以下条件,则该基本路径可以作为答案
(d leq k)
(d = k (mod 2))
于是暴力做即可
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
vector <int> g[N];
int n,t1,t2,q,x,y,a,b,k,fa[N][20],dep[N];
void dfs(int p,int fr) {
for(int q:g[p]) if(q!=fr) {
fa[q][0]=p;
dep[q]=dep[p]+1;
dfs(q,p);
}
}
int lca(int p,int q) {
if(dep[p]<dep[q]) swap(p,q);
for(int i=17;i>=0;--i) if(dep[fa[p][i]]>=dep[q]) p=fa[p][i];
for(int i=17;i>=0;--i) if(fa[p][i]-fa[q][i]) p=fa[p][i],q=fa[q][i];
if(p-q) return fa[p][0];
return p;
}
int dis(int p,int q) {
return dep[p]+dep[q]-2*dep[lca(p,q)];
}
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<n;i++) {
cin>>t1>>t2;
g[t1].push_back(t2);
g[t2].push_back(t1);
}
dep[1]=1;
dfs(1,0);
for(int i=1;i<=17;i++) {
for(int j=1;j<=n;j++) {
fa[j][i]=fa[fa[j][i-1]][i-1];
}
}
cin>>q;
for(int i=1;i<=q;i++) {
cin>>x>>y>>a>>b>>k;
int d;
d=dis(a,b);
if(d<=k && (d%2)==(k%2)) {puts("YES"); continue;}
d=dis(a,x)+1+dis(y,b);
if(d<=k && (d%2)==(k%2)) {puts("YES"); continue;}
d=dis(a,y)+1+dis(x,b);
if(d<=k && (d%2)==(k%2)) {puts("YES"); continue;}
puts("NO");
}
}
以上是关于[CF1304E] 1-Trees and Queries - LCA的主要内容,如果未能解决你的问题,请参考以下文章
[CF1304E] 1-Trees and Queries - LCA
CF-div2-620-E. 1-Trees and Queries LCA 树上点距离
Codeforces 1304E. 1-Trees and Queries
Populate A List Item With Record Group In Oracle Forms Using Populate_List And Create_Group_From_Que