• [CF1304E] 1-Trees and Queries


    由于可以走重边,所以任意一条路径长 + 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");
        }
    }
    
  • 相关阅读:
    better-scroll 介绍
    promise 异步编程
    vue网址路由的实时检测
    浏览器本地存储的使用
    获取元素的位置
    如何设置动画的运动效果
    实现对称加密及非对称公钥加密
    Centos 7系统启动修复
    Centos 7服务启动文件
    内核编译-4.12
  • 原文地址:https://www.cnblogs.com/mollnn/p/12321963.html
Copyright © 2020-2023  润新知