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\n"; 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\n"; 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\n"; 89 continue; 90 } 91 cout<<"NO\n"; 92 } 93 return 0; 94 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)