[ABC267F] Exactly K Steps
Problem Statement
You are given a tree with $N$ vertices. The vertices are numbered $1, \dots, N$, and the $i$-th ($1 \leq i \leq N - 1$) edge connects Vertices $A_i$ and $B_i$.
We define the distance between Vertices $u$ and $v$ on this tree by the number of edges in the shortest path from Vertex $u$ to Vertex $v$.
You are given $Q$ queries. In the $i$-th ($1 \leq i \leq Q$) query, given integers $U_i$ and $K_i$, print the index of any vertex whose distance from Vertex $U_i$ is exactly $K_i$. If there is no such vertex, print -1.
Constraints
- $2 \leq N \leq 2 \times 10^5$
- $1 \leq A_i \lt B_i \leq N \, (1 \leq i \leq N - 1)$
- The given graph is a tree.
- $1 \leq Q \leq 2 \times 10^5$
- $1 \leq U_i, K_i \leq N \, (1 \leq i \leq Q)$
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
$N$
$A_1$ $B_1$
$\vdots$
$A_{N-1}$ $B_{N-1}$
$Q$
$U_1$ $K_1$
$\vdots$
$U_Q$ $K_Q$
Output
Print $Q$ lines. The $i$-th ($1 \leq i \leq Q$) line should contain the index of any vertex whose distance from Vertex $U_i$ is exactly $K_i$ if such a vertex exists; if not, it should contain -1. If there are multiple such vertices, you may print any of them.
Sample Input 1
5
1 2
2 3
3 4
3 5
3
2 2
5 3
3 3
Sample Output 1
4
1
-1
- Two vertices, Vertices $4$ and $5$, have a distance exactly $2$ from Vertex $2$.
- Only Vertex $1$ has a distance exactly $3$ from Vertex $5$.
- No vertex has a distance exactly $3$ from Vertex $3$.
Sample Input 2
10
1 2
2 3
3 5
2 8
3 4
4 6
4 9
5 7
9 10
5
1 1
2 2
3 3
4 4
5 5
Sample Output 2
2
4
10
-1
-1
对于一个点 \(u\),如果我们找到离他最远的点 \(v\),那么此时如果 \((u,v)\) 的距离还超不过 \(k\),肯定无解。否则,就在路径 \((u,v)\) 上寻找到那个离 \(u\) 刚好是 \(k\) 格的点就行了。
但是最远的点在哪里呢?有一个定理,就是一棵树上,离一个点最远的点一定是直径的两端点之一。
所以求出原来直径的两个端点 \((u',v')\),然后以他们两个分别为根,跑出一次倍增。询问的时候就可以看两个端点哪个离他更远,然后在对应的倍增数组上找到离他恰好为 \(k\) 的点。复杂度 \(O(nlogn+qlogn)\)
当然也可以用长剖卡到 \(O(nlogn+q)\),不过没必要。
#include<cstdio>
const int N=2e5+5;
int n,u,v,rt,fa[N][23],dp1[N],dp2[N],f[N][23],ans(-1),hd[N],e_num,q,k;
struct edge{
int v,nxt;
}e[N<<1];
void add_edge(int u,int v)
{
e[++e_num]=(edge){v,hd[u]};
hd[u]=e_num;
}
void dfs(int x,int y,int dep)
{
if(dep>ans)
ans=dep,rt=x;
for(int i=hd[x];i;i=e[i].nxt)
if(e[i].v!=y)
dfs(e[i].v,x,dep+1);
}
void sou(int x,int y)
{
dp1[x]=dp1[y]+1,f[x][0]=y;
if(dp1[x]>ans)
ans=dp1[x],rt=x;
for(int i=1;i<20;i++)
f[x][i]=f[f[x][i-1]][i-1];
for(int i=hd[x];i;i=e[i].nxt)
if(e[i].v!=y)
sou(e[i].v,x);
}
void suo(int x,int y)
{
dp2[x]=dp2[y]+1,fa[x][0]=y;
// printf("%d %d\n",x ,dp2[x]);
for(int i=1;i<20;i++)
fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=hd[x];i;i=e[i].nxt)
if(e[i].v!=y)
suo(e[i].v,x);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
dfs(1,0,0);
ans=0;
sou(rt,ans=0);
suo(rt,0);
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&u,&k);
if(dp1[u]>k)
{
for(int i=0;i<20;i++)
if(k>>i&1)
u=f[u][i];
printf("%d\n",u);
}
else if(dp2[u]>k)
{
for(int i=0;i<20;i++)
if(k>>i&1)
u=fa[u][i];
printf("%d\n",u);
}
else
puts("-1");
}
}
[ABC267F] Exactly K Steps的更多相关文章
- 字典序的第K小数字
今天zyb参加一场面试,面试官听说zyb是ACMer之后立马抛出了一道算法题给zyb:有一个序列,是1到n的一种排列,排列的顺序是字典序小的在前,那么第k个数字是什么?例如n=15,k=7, 排列顺序 ...
- 第十四届华中科技大学程序设计竞赛 K Walking in the Forest【二分答案/最小化最大值】
链接:https://www.nowcoder.com/acm/contest/106/K 来源:牛客网 题目描述 It's universally acknowledged that there'r ...
- [LeetCode] Rotate Array 旋转数组
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- Functional Programming without Lambda - Part 2 Lifting, Functor, Monad
Lifting Now, let's review map from another perspective. map :: (T -> R) -> [T] -> [R] accep ...
- 35.两链表的第一个公共结点[Find the first common node of two linked list]
[题目] 两个单向链表,找出它们的第一个公共结点. 链表的结点定义为: C++ Code 123456 struct ListNode { int m_nKey; ...
- array题目合集
414. Third Maximum Number 给一个非空的整数数组,找到这个数组中第三大的值,如果不存在,那么返回最大的值.要求时间复杂度为o(n) 例如: Example 1: Input: ...
- 189. Rotate Array
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- LEETCODE —— Linked List Cycle [Floyd's cycle-finding algorithm]
Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it ...
- leetcode 189
189. Rotate Array Rotate an array of n elements to the right by k steps. For example, with n = 7 and ...
- poj2486Apple Tree[树形背包!!!]
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9989 Accepted: 3324 Descri ...
随机推荐
- 【pandas小技巧】--花哨的DataFrame
最近github上发现了一个库(plottable),可以用简单的方式就设置出花哨的 DataFrame 样式. github上的地址:https://github.com/znstrider/plo ...
- 国内镜像安装Python解释器及扩展包
一.下载Python解释器 1.下载地址 官网(下载速度很慢):Welcome to Python.org 淘宝镜像(推荐):CNPM Binaries Mirror (npmmirror.com) ...
- Web组态可视化软件之BY组态可视化平台介绍
Web组态可视化软件之BY组态可视化平台介绍 关于组态软件,首先要从组态的概念开始说起. 什么是组态 组态(Configure)的概念来自于20世纪70年代中期出现的第一代集散控制系统(Distrib ...
- 织梦DEDEBIZ调用全站文章数量
织梦DEDEBIZ如何调用全站文章数量{dede:sql sql="select count(*) as c from biz_archives} 共有文章:[field:c/] 篇 {/d ...
- 研发三维GIS系统笔记/实现wgs84投影-001
1. 工作内容,改造引擎,支持wgs84投影 改造原因:目前投影是墨卡托投影(与Google Map一致) 目前的GIS系统是二维的采用这个坐标系是没有问题的 但不支持wgs84瓦片数据以及高程数据, ...
- python setup.py sdist bdist_wheel
# python setup.py sdist bdist_wheel# twine upload dist/*import ioimport osimport sysfrom shutil impo ...
- MySQL5.7版本单节点大数据量迁移到PXC8.0版本集群全记录-2
本文主要记录57版本升级80版本的过程,供参考. ■ 57版本升级80版本注意事项 默认字符集由latin1变为utf8mb4 MyISAM系统表全部换成InnoDB表 sql_mode参数默认值变化 ...
- umich cv-3-1
UMICH CV Neural Network 对于传统的线性分类器,分类效果并不好,所以这节引入了一个两层的神经网络,来帮助我们进行图像分类 可以看出它的结构十分简单,x作为输入层,经过max(0, ...
- Go泛型解密:从基础到实战的全方位解析
本篇文章深入探讨了Go语言的泛型特性,从其基础概念到高级用法,并通过实战示例展示了其在实际项目中的应用. 关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互 ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配
在WPF应用端开发,它的界面类似于Winform端,因此我们也需要对系统的菜单进行动态配置,这样才能把系统的功能弹性发挥到极致,通过动态菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分 ...