• Codeforces Round #620 (Div. 2)E(LCA求树上两点最短距离)


    LCA求树上两点最短距离,如果a,b之间距离小于等于k并且奇偶性与k相同显然YES;或者可以从a先走到x再走到y再走到b,并且a,x之间距离加b,y之间距离+1小于等于k并且奇偶性与k相同也输出YES;或者从a走到y再走到x再走到b,并且总距离+1小于等于k并且奇偶性与k相同同样输出YES;否则输出NO。

     1 #define HAVE_STRUCT_TIMESPEC
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 int dis[100007];
     5 int cnt;
     6 struct edge{int to,nxt;
     7     //int v;
     8 };
     9 edge e[100007<<1];
    10 int tot,head[100007];
    11 void adde(int u,int v){
    12     e[++tot].to=v;
    13     //e[tot].v=w;
    14     e[tot].nxt=head[u];
    15     head[u]=tot;
    16 }
    17 int fa[100007][27];
    18 int dep[100007];
    19 void bfs(int rt){
    20     queue<int> q;
    21     dep[rt]=0;
    22     fa[rt][0]=rt;
    23     q.push(rt);
    24     while(!q.empty()){
    25         int tmp=q.front();q.pop();
    26         for(int i=1;i<18;i++)
    27             fa[tmp][i]=fa[fa[tmp][i-1]][i-1];
    28         for(int i=head[tmp];i;i=e[i].nxt){
    29             int v=e[i].to;
    30             if(v==fa[tmp][0])continue;
    31             dep[v]=dep[tmp]+1;
    32             fa[v][0]=tmp;
    33             q.push(v);
    34         }
    35     }
    36 }
    37 int query_lca(int u,int v){
    38     if(dep[u]>dep[v])swap(u,v);
    39     int hu=dep[u],hv=dep[v];
    40     int tu=u,tv=v;
    41     for(int det=hv-hu,i=0;det;det>>=1,i++)
    42         if(det&1)tv=fa[tv][i];
    43     if(tu==tv)return tu;
    44     for(int i=17;i>=0;i--){
    45         if(fa[tu][i]==fa[tv][i])continue;
    46         tu=fa[tu][i];tv=fa[tv][i];
    47     }return fa[tu][0];
    48 }
    49 int query_kth(int u,int k){
    50     for(int det=k,i=0;det;det>>=1,i++)if(det&1)u=fa[u][i];return u;
    51 }
    52 int query_dist(int a,int b){
    53     int lca=query_lca(a,b);
    54     return dep[a]+dep[b]-2*dep[lca];
    55 }
    56 int main(){
    57     ios::sync_with_stdio(false);
    58     cin.tie(NULL);
    59     cout.tie(NULL);
    60     int n;
    61     cin>>n;
    62     for(int i=1;i<n;++i){
    63         int u,v;
    64         cin>>u>>v;
    65         adde(u,v);
    66         adde(v,u);
    67     }
    68     bfs(1);
    69     int q;
    70     cin>>q;
    71     while(q--){
    72         int x,y,a,b,k;
    73         cin>>x>>y>>a>>b>>k;
    74         int dist=query_dist(a,b);
    75         if(dist<=k&&dist%2==k%2){
    76             cout<<"YES
    ";
    77             continue;
    78         }
    79         int dist2=query_dist(a,x);
    80         int dist3=query_dist(b,y);
    81         if(dist2+dist3+1<=k&&(dist2+dist3+1)%2==k%2){
    82             cout<<"YES
    ";
    83             continue;
    84         }
    85         int dist4=query_dist(a,y);
    86         int dist5=query_dist(b,x);
    87         if(dist4+dist5+1<=k&&(dist4+dist5+1)%2==k%2){
    88             cout<<"YES
    ";
    89             continue;
    90         }
    91         cout<<"NO
    ";
    92     }
    93     return 0;
    94 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    如何在SpringMVC中使用REST风格的url
    c#实现的udt
    数据库查询服务化-缓存和分页
    c#常用数据库封装再次升级
    c#数据库连接池Hikari重构升级
    c# 常用数据库封装
    聊聊数据存储查询
    c#分析SQL语句
    c# 分析SQL语句中的表操作
    c#最近博文结尾
  • 原文地址:https://www.cnblogs.com/ldudxy/p/12317638.html
Copyright © 2020-2023  润新知