传送门

题目大意

给你一棵无根树,然后询问Q次,每次把点$x$和点$y$连接,问你从点$a$到点$b$是否有一条长度为$k$的简单路径,每次询问完后会把新添加的边删除。

思路:树上LCA

题目跟2019pjt4很像,可以说这个就是那道题的树上版本。

因为每次讯问完都会把新添的边删去,所以我们只要想如何处理添完一条边后$a$到$b$的简单路径。

所以我们可以分两种情况讨论:

    1. 1.把$\left ( x,y \right )$算进$\left ( a,b \right )$的路径。
    2. 2.只算$\left ( a,b \right )$的路径。

简单来说就是求a->x->y->b或a->y->x->b或a->b的路径,众所周知树上两点之间的路径长度可以用LCA来求然后就没了。

然后我们想一下,如果$k$比路径长度大的话,我们就往父亲节点走,很容易发现,如果多出来的部分如果不是2的倍数的话,那么就不存在一条长度为$k$的路径。

不理解的可以自己画一下图。

代码

#include <bits/stdc++.h>

#define RI register int

using namespace std;

template <class T>
inline void read(T &x) {
T f = 1; x = 0; char c = getchar();
while(c > '9' || c < '0') {
if(c == '-')
f = -f;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
x *= f;
} const int N = 1e5 + 7;
int n;
struct Edge {
int nxt, to;
} edge[N << 1];
int head[N], tot;
int dep[N], st[N][21]; inline void add(int x, int y) {
edge[++tot].nxt = head[x];
edge[tot].to = y;
head[x] = tot;
} inline void Read() {
read(n);
for(RI i = 1; i < n; i++) {
int x, y;
read(x), read(y);
add(x, y);
add(y, x);
}
} inline void dfs(int x, int fa) {
dep[x] = dep[fa] + 1;
st[x][0] = fa;
for(RI i = 1; i <= 20; i++)
st[x][i] = st[st[x][i - 1]][i - 1];
for(RI i = head[x]; i; i = edge[i].nxt) {
int y = edge[i].to;
if(y == fa)
continue;
dfs(y, x);
}
} inline int Lca(int x, int y) {
if(dep[y] > dep[x])
swap(x, y);
for(RI i = 20; i >= 0; i--)
if(dep[st[x][i]] >= dep[y])
x = st[x][i];
if(x == y)
return x;
for(RI i = 20; i >= 0; i--)
if(st[x][i] != st[y][i])
x = st[x][i], y = st[y][i];
return st[x][0];
} int main() {
Read();
dfs(1, 0);
int T;
read(T);
while(T--) {
int x, y, a, b, k;
int res1, res2, res3;
read(x), read(y), read(a), read(b), read(k);
int Lca1 = Lca(a, b), Lca2_1 = Lca(a,x), Lca2_2 = Lca(y,b), Lca3_1 = Lca(a,y), Lca3_2 = Lca(x,b); res1 = dep[a] + dep[b] - 2 * dep[Lca1];
res2 = dep[a] + dep[x] + dep[y] + dep[b] - 2 * dep[Lca2_1] - 2 * dep[Lca2_2] + 1;
res3 = dep[a] + dep[x] + dep[y] + dep[b] - 2 * dep[Lca3_1] - 2 * dep[Lca3_2] + 1; if(res1 <= k && (k - res1) % 2 == 0) {
puts("YES");
continue;
}
if(res2 <= k && (k - res2) % 2 == 0) {
puts("YES");
continue;
}
if(res3 <= k && (k - res3) % 2 == 0) {
puts("YES");
continue;
}
puts("NO");
}
return 0;
}

题解-------CF1304E 1-Trees and Queries的更多相关文章

  1. 题解 CF1304E 【1-Trees and Queries】

    前言 这场比赛,在最后 \(5\) 分钟,我想到了这道题的 \(Idea\),但是,没有打完,比赛就结束了. 正文 题目意思 这道题目的意思就是说,一棵树上每次给 \(x\) 和 \(y\) 节点连 ...

  2. Codechef Dynamic Trees and Queries

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

  3. 题解-Codeforces917D Stranger Trees

    Problem \(\mathrm{Codeforces~917D}\) 题意概要:一棵 \(n\) 个节点的无向树.问在 \(n\) 个点的完全图中,有多少生成树与原树恰有 \(k\) 条边相同,对 ...

  4. 【题解】Luogu CF817F MEX Queries

    原题传送门 817,我突然想到了某8位质数 这题珂以说是珂朵莉树的模板 三个操作都肥肠简单,前两个区间赋值,第三个区间0变1,1变0 每次输出从头开始扫描就行(我忘了珂朵莉树的性质,竟然还动态维护最左 ...

  5. LeetCode题解之Leaf-Similar Trees

    1.题目描述 2.问题分析 将叶子节点的值放入vector,然后比较. 3.代码 bool leafSimilar(TreeNode* root1, TreeNode* root2) { vector ...

  6. [CodeChef-ANUDTQ] Dynamic Trees and Queries

    类似维护括号序列,给每个点建两个点,然后所有操作都能轻松支持了.注意sum和lastans是long long. #include<cstdio> #include<algorith ...

  7. 题解 CF375D 【Tree and Queries】

    首先,子树上的查询问题可以通过$DFS$序转为序列问题 再一看,没有修改,可以离线,这不就是莫队吗? 我们用$sum_i$表示出现次数$\geq i$的个数 用$val_i$表示第$i$种颜色的出现次 ...

  8. 题解 UVA1479 【Graph and Queries】

    \[ \text{Preface} \] 算是一道思维难度稍易,代码难度稍难的题吧. \[ \text{Description} \] 给出一张 \(n\) 个点,\(m\) 条边的图,点带权.需要支 ...

  9. 题解 CF938G 【Shortest Path Queries】

    题目让我们维护一个连通无向图,边有边权,支持加边删边和询问从\(x\)到\(y\)的异或最短路. 考虑到有删边这样的撤销操作,那么用线段树分治来实现,用线段树来维护询问的时间轴. 将每一条边的出现时间 ...

随机推荐

  1. Dubbo与Zookeeper 简介

    转自http://blog.csdn.net/congcong68/article/details/41113239 首先说一下Dubbo解决什么问题: (1)当服务越来越多时,服务Url配置管理变得 ...

  2. Swift字符串截取与Range使用

    1.String.Index String.Index表示一个位置,使用String与String.Index可以获取该位置的Character let str = "123456789&q ...

  3. expdp远程导出oracle库

    1.手动在本地建目录 E:\lvchengData 2.执行命令 create or replace directory data as 'E:\lvchengData\'; 3.为本地system用 ...

  4. one_day_one_linuxCmd---crontab 命令

    <坚持每天学习一个 linux 命令,今天我们来学习 tar 命令> 摘要:crond 是 linux 下用来周期性的执行某种任务或等待处理事件的一个守护进程,周期执行的任务一般由 cro ...

  5. 第四章:Schema与数据类型优化

    1. 选择优化的数据类型 选择数据类型的原则 更小的通常更好:选择可以正确存储数据的最小数据类型 小的数据类型消耗更少的内存.CPU;占用更少的磁盘 选用简单的数据类型:简单的数据类型通常需要更少的C ...

  6. 一天一个设计模式——工厂方法(FactoryMethod)模式

    一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...

  7. Teamviewer 退出时设置不锁屏

    在pc端teamviewer登录同伴的机器时,页面最上端会出现一个工具栏,如图: 点击"动作"  ---〉"锁定" 取消打钩 "在会话结束时锁定&qu ...

  8. 学会拒绝,是一种智慧——OO电梯章节优化框架的思考

    在本章的三次作业里,每次作业我都有一个主题,分别是:托盘型共享数据.单步电梯运行优化.多部电梯运行优化,因而电梯优化实际是第二.三次作业.虽然后两次作业从性能分上看做得还不错,但阅读其他大佬博客,我深 ...

  9. 直击JDD | 徐雷:智能化零售,以技术为驱动力的突破路径

    "京东零售已经成为一家典型的以技术驱动为主的零售公司".在11月19日召开的 2019京东全球科技探索者大会上,京东零售集团CEO徐雷首次阐释了京东零售的智能化零售路径. 徐雷指出 ...

  10. 2019.3.11 JavaScript课上笔记

    ---恢复内容开始--- 字面值写到左边 var  x= "1"; ++x .x++ // 都有隐式类型转换 x += 1; // 是字符串的拼接 === 判断引用的对象是不是同一 ...