码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1304E] 1-Trees and Queries - LCA

时间:2020-02-17 16:01:00      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:com   its   mic   ace   push   tor   puts   void   include   

技术图片

由于可以走重边,所以任意一条路径长 + 2 仍然对应至少一条合法路径

很显然我们有 \(3\) 种基本路径

  • 不经过 \((x,y)\)

  • 经过 \(x \to y\)

  • 经过 \(y \to 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

标签:com   its   mic   ace   push   tor   puts   void   include   

原文地址:https://www.cnblogs.com/mollnn/p/12321963.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!