题解-------CF1304E 1-Trees and Queries
题目大意
给你一棵无根树,然后询问Q次,每次把点$x$和点$y$连接,问你从点$a$到点$b$是否有一条长度为$k$的简单路径,每次询问完后会把新添加的边删除。
思路:树上LCA
题目跟2019pjt4很像,可以说这个就是那道题的树上版本。
因为每次讯问完都会把新添的边删去,所以我们只要想如何处理添完一条边后$a$到$b$的简单路径。
所以我们可以分两种情况讨论:
- 1.把$\left ( x,y \right )$算进$\left ( a,b \right )$的路径。
- 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的更多相关文章
- 题解 CF1304E 【1-Trees and Queries】
前言 这场比赛,在最后 \(5\) 分钟,我想到了这道题的 \(Idea\),但是,没有打完,比赛就结束了. 正文 题目意思 这道题目的意思就是说,一棵树上每次给 \(x\) 和 \(y\) 节点连 ...
- Codechef Dynamic Trees and Queries
Home » Practice(Hard) » Dynamic Trees and Queries Problem Code: ANUDTQSubmit https://www.codechef.co ...
- 题解-Codeforces917D Stranger Trees
Problem \(\mathrm{Codeforces~917D}\) 题意概要:一棵 \(n\) 个节点的无向树.问在 \(n\) 个点的完全图中,有多少生成树与原树恰有 \(k\) 条边相同,对 ...
- 【题解】Luogu CF817F MEX Queries
原题传送门 817,我突然想到了某8位质数 这题珂以说是珂朵莉树的模板 三个操作都肥肠简单,前两个区间赋值,第三个区间0变1,1变0 每次输出从头开始扫描就行(我忘了珂朵莉树的性质,竟然还动态维护最左 ...
- LeetCode题解之Leaf-Similar Trees
1.题目描述 2.问题分析 将叶子节点的值放入vector,然后比较. 3.代码 bool leafSimilar(TreeNode* root1, TreeNode* root2) { vector ...
- [CodeChef-ANUDTQ] Dynamic Trees and Queries
类似维护括号序列,给每个点建两个点,然后所有操作都能轻松支持了.注意sum和lastans是long long. #include<cstdio> #include<algorith ...
- 题解 CF375D 【Tree and Queries】
首先,子树上的查询问题可以通过$DFS$序转为序列问题 再一看,没有修改,可以离线,这不就是莫队吗? 我们用$sum_i$表示出现次数$\geq i$的个数 用$val_i$表示第$i$种颜色的出现次 ...
- 题解 UVA1479 【Graph and Queries】
\[ \text{Preface} \] 算是一道思维难度稍易,代码难度稍难的题吧. \[ \text{Description} \] 给出一张 \(n\) 个点,\(m\) 条边的图,点带权.需要支 ...
- 题解 CF938G 【Shortest Path Queries】
题目让我们维护一个连通无向图,边有边权,支持加边删边和询问从\(x\)到\(y\)的异或最短路. 考虑到有删边这样的撤销操作,那么用线段树分治来实现,用线段树来维护询问的时间轴. 将每一条边的出现时间 ...
随机推荐
- 19 ~ express ~ 文章的增加 , 查看 ,修改 ,删除
一,前台 1,添加文章 /views/admin/content_add.html {% extends 'layout.html' %} {% block main %} <ol class= ...
- 1 ~ express ~ 初始化。安装第三方模块express。中间件
一,初始化 二,安装第三方模块express 三,安装中间件 1,bodyParser : 解析 post 请求数据 2,cookies : 读写 cookie 3,swig :模板解析引擎 4,mo ...
- EL&JSTL简单介绍
EL表达式 是为了简化咱们的jsp代码,具体一点就是为了简化在jsp里面写的那些java代码. 写法格式 ${表达式 } 如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取. 一 ...
- nested exception is java.lang.IllegalArgumentException: warning no match for this type name: res [Xlint:invalidAbsoluteTypeName]
注:内有单词(sping)写错,请忽略,不影响程序运行 运行时报错: Exception in thread "main" org.springframework.beans.fa ...
- 常用模块-正则re
常用模块之正则模块 """ 正则表达式与re模块的关系 1.正则表达式是一门独立的技术,任何语言均可使用 2.python中要想使用正则表达式需要通过re模块 " ...
- POJ 1502:MPI Maelstrom Dijkstra模板题
MPI Maelstrom Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6499 Accepted: 4036 Des ...
- C++ 一般模板友元关系
//一般模板友元关系 #include "stdafx.h" #include <iostream> using namespace std; template< ...
- kubelet组件详解---链接
https://blog.csdn.net/jettery/article/details/78891733
- Java8集合框架——集合工具类Arrays内部方法浅析
java.util.Arrays 备注:本文只对 Java8 中的 java.util.Arrays 中提供的基本功能进行大致介绍,并没有对其具体的实现原理进行深入的探讨和分析.详情可自己深入观摩源码 ...
- leetcode--200--python(深度广度优先遍历实现代码)
点滴积累,厚积薄发,做好每一天,向时间要效率,向生命要质量. 一.深度优先搜索和广度优先搜索DFS(Depth-First-Search),是盲目搜索算法的一种.常常用在树的遍历及图的处理上.假设当前 ...