[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 ...
随机推荐
- 为什么NoSQL不支持事务
为什么NoSQL不支持事务 1. 背景 看书<Neo4j权威指南>的时候,发现个问题:日常的NoSQL都不支持事务(ACID). 2. 问题 事务对数据的存储过程是有利的,既然事情是有利的 ...
- [远程Call]32位远程多参数带返回调用
[远程Call]32位远程多参数带返回调用 引子 在Windows上可以使用CreateRemoteThread实现远程Call,但是有不带返回值且只能传递一个参数的限制. 解决思路 将多个参数利用V ...
- 手写RISC-V处理器(1)
由来 由于去年工作变动,有幸进入了芯片行业,但主要工作内容为基于RISC-V的嵌入式应用软件开发,几乎接触不到芯片设计的相关知识,然而随着工作的深入,越来越想探究一下运行在软件之下的CPU的世界,于是 ...
- CodeForces 1187E Tree Painting
题意:给定一棵\(n\)个点的树 初始全是白点 要求你做\(n\)步操作,每一次选定一个与一个黑点相隔一条边的白点,将它染成黑点,然后获得该白点被染色前所在的白色联通块大小的权值. 第一次操作可以任意 ...
- 2015-CS
2015-CS 数据库部分 create table [EMPLOYEE]( [EmpNo] varchar(10) not null primary key, [EmpName] varchar(1 ...
- ContentPresenter使用DataTemplate
在使用自定义样式内容时,有时也需要在自定义样式中绑定一下数据模板 可以使用ContentPresenter的ContentTemplate绑定定义好的资源 DateTemplate 用法代码如下 &l ...
- Modbus转Profinet网关改写变频器运行状态在1200PLC程序控制实例
兴达易控Modbus转Profinet网关将丹佛斯变频器接入西门子 1200PLC 配置案例 案例简介: 本案例是兴达易控Modbus转Profinet网关连接丹佛斯变频器在西门子 1200PLC程序 ...
- 3DMatch
详细描述链接:3DMatch 数据集.github(介绍非常详细) 官网主页: 主页 3DMatch数据集收集了来自于62个场景的数据,其中54个场景的数据用于训练,8个场景的数据用于评估,其具体名称 ...
- html表单与框架
1.以form开头 其中常用的属性有 action="" method="" enctype="" name="" ...
- [第五空间 2021]yet_another_mysql_injection
随便输入进去,发现只有账号是admin可以进入 使用弱密码admin admin,报错为hacker 就没啥办法了,想着F12看一下源码 发现有一个source,打开看看 可以发现username是固 ...