题意

给你一棵树,q个询问(x,y,a,b,k),每次问你如果在(x,y)加一条边,那么a到b能不能走k步,同一个点可以走多次

思路(翻译题解)

对于一条a到b的最短路径x,可以通过左右横跳的方法把他扩大成任意的\(x+2i(i\geq 0)\),只要存在一个能使得它等于k的i即可。。

在这一题中,如果x和i连了边,那么就会存在三条可能的最短路径:(从哪到哪都是在原树上)

1.从a到b

2.从a到x,走加的边到y,从y到b

3.从a到y,走加的边到x,从x到b

判断是否存在满足就好了

代码

思路要整理一下树上问题的结构体了。。

  1. int n;
  2. int pre[maxn];
  3. vector<int>g[maxn];
  4. void dfs(int x, int fa, int dp){
  5. pre[x]=dp;
  6. for(int i = 0; i <(int)g[x].size(); i++){
  7. int y = g[x][i];
  8. if(y==fa)continue;
  9. dfs(y,x,dp+1);
  10. }
  11. }
  12. int dep[maxn],fa[maxn][34];
  13. int lg[maxn];
  14. void ddfs(int x, int lst){
  15. dep[x] = dep[lst] + 1;
  16. fa[x][0] = lst;
  17. for(int i = 1; (1<<i) <= dep[x]; i++){
  18. fa[x][i] = fa[fa[x][i-1]][i-1];
  19. }
  20. for(int i = 0; i < (int)g[x].size(); i++){
  21. int y = g[x][i];
  22. if(y==lst) continue;
  23. ddfs(y, x);
  24. }
  25. return;
  26. }
  27. int lca(int x, int y){
  28. if(dep[x] > dep[y])swap(x,y);
  29. while(dep[x] != dep[y]){
  30. if(lg[dep[y]-dep[x]]-1>=0)y = fa[y][lg[dep[y]-dep[x]]-1];
  31. else y = fa[y][0];
  32. }
  33. if(x==y) return x;
  34. for(int i = lg[dep[y]]; i >= 0; i--){
  35. if(fa[x][i] != fa[y][i]){
  36. x = fa[x][i];
  37. y = fa[y][i];
  38. }
  39. }
  40. return fa[x][0];
  41. }
  42. int len(int x ,int y){
  43. return pre[x]+pre[y]-2*pre[lca(x,y)];
  44. }
  45. int f(int x, int a, int b){
  46. int L =lca(a,b);
  47. if(lca(L,x)==L){
  48. return min(len(x,lca(x,a)),len(x,lca(x,b)));
  49. }
  50. else return len(x,L);
  51. }
  52. int main(){
  53. scanf("%d", &n);
  54. for(int i = 1; i <= n; i++){
  55. lg[i] = lg[i-1]+(1<<lg[i-1]==i);
  56. }
  57. for(int i = 1; i < n; i++){
  58. int x,y;
  59. scanf("%d %d" ,&x, &y);
  60. g[x].pb(y);g[y].pb(x);
  61. }
  62. dfs(1,0,0);
  63. ddfs(1,0);
  64. int q;
  65. scanf("%d", &q);
  66. while(q--){
  67. int x,y,a,b,k;
  68. int ok=0;
  69. scanf("%d %d %d %d %d", &x, &y, &a, &b, &k);
  70. if((len(a,x)+len(y,b)+1)%2==k%2&&(len(a,x)+len(y,b)+1)<=k)ok=1;
  71. if((len(a,y)+len(x,b)+1)%2==k%2&&(len(a,y)+len(x,b)+1)<=k)ok=1;
  72. if(len(a,b)%2==k%2&&len(a,b)<=k)ok=1;
  73. if(ok){
  74. printf("YES\n");
  75. }
  76. else printf("NO\n");
  77. }
  78. return 0;
  79. }

Codeforces 1304E 1-Trees and Queries (树上距离+思维)(翻译向)的更多相关文章

  1. 【CF375D】Trees and Queries——树上启发式合并

    (题面不是来自Luogu) 题目描述 有一个大小为n且以1为根的树,树上每个点都有对应的颜色ci.现给出m次询问v, k,问以v为根的子树中有多少种颜色至少出现了k次. 输入格式 第一行两个数n,m表 ...

  2. Codeforces 161.D. Distance in Tree-树分治(点分治,不容斥版)-树上距离为K的点对数量-蜜汁TLE (VK Cup 2012 Round 1)

    D. Distance in Tree time limit per test 3 seconds memory limit per test 512 megabytes input standard ...

  3. POJ1741--Tree (树的点分治) 求树上距离小于等于k的点对数

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12276   Accepted: 3886 Description ...

  4. Codechef Dynamic Trees and Queries

    Home » Practice(Hard) » Dynamic Trees and Queries Problem Code: ANUDTQSubmit https://www.codechef.co ...

  5. 洛谷 P3806 【模板】点分治1-树分治(点分治,容斥版) 模板题-树上距离为k的点对是否存在

    P3806 [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式 n,m 接下来n-1条边a,b,c描述a到b有一条长度 ...

  6. P3806 离线多次询问 树上距离为K的点对是否存在 点分治

    询问树上距离为k的点对是否存在 直接n^2暴力处理点对 桶排记录 可以过 #include<cstdio> #include<cstring> #include<algo ...

  7. Codeforces 1304E. 1-Trees and Queries 代码(LCA 树上两点距离判奇偶)

    https://codeforces.com/contest/1304/problem/E #include<bits/stdc++.h> using namespace std; typ ...

  8. Codeforces 1304E. 1-Trees and Queries

    简述题意,给你一课最小支撑树,对每个询问,在原有的路径上增加x-y,问a-b是否有路径长度为k的路,每条路每个点可以重复使用 由于是最小支撑树,我们可以用LCA来快速判断每个点之间的距离,那么现在就要 ...

  9. 【非原创】codeforces 1060E Sergey and Subway 【树上任意两点距离和】

    学习博客:戳这里 本人代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 con ...

随机推荐

  1. html1,初识html

    vs code编辑器 安装插件 chinese 中文支持 open in browser 快速预览文件 view in browser 快捷键 快捷键 描述 shift + end 选中从光标到行尾 ...

  2. key_load_public: invalid format

    ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

  3. 解决apt-get命令出现的安装源错误

    首先linux环境下打开网页,输入上网账号密码,确保已经联网 直接安装软件或库的时候,在管理员模式下,在终端输入:apt-get install A可以自动安装A 有时会出现下面的安装源错误 这是因为 ...

  4. AES中ECB模式的加密与解密(Python3.7)

    本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...

  5. 暑假提高组集训Day1 T1

    说实话,今天的题真的有点难! ~备受打击~ 我们先来看一看第一题吧 看起来好像不太简单,其实并不难 下面来提供两种方法吧 1.做法一 //签到题 /* 那么这一题就是告诉你n个点的坐标,把它们分别放到 ...

  6. 【python系统学习06】一张图看懂列表并学会操作

    点击跳转-原文地址 数据类型 - 列表(list) 「目录:」 一张图了解列表 列表是什么 列表长啥样 语法格式 代码示例 格式特征 列表定义 列表操作 - 提取单个:偏移量 什么是偏移量 偏移量提取 ...

  7. python IO非阻塞模型

    server端 import socket sk = socket.socket() sk.bind(('127.0.0.1', 8010)) sk.setblocking(False) # sk.l ...

  8. flash-session

    作用:更改session存储的位置 1.session默认存放在浏览器的cookie中 源码 wsgi->app.__call__->wsgi_app->push->self. ...

  9. L1和L2:损失函数和正则化

    作为损失函数 L1范数损失函数 L1范数损失函数,也被称之为最小绝对值误差.总的来说,它把目标值$Y_i$与估计值$f(x_i)$的绝对差值的总和最小化. $$S=\sum_{i=1}^n|Y_i-f ...

  10. 啥叫ORM

    名字: object / relation map 对象关系映射 定义: 通过(描述对象和数据库之间映射的)元数据把对象自动转为关系数据 一般都是作为中间件 优缺: 优点是自动化,屏蔽了SQL语句,而 ...