CF1006E Military Problem 题解
CF1006E Military Problem 题解
题意
给定一颗有
对于每个节点
有
如果子树中没有
暴力做法
对于每个询问
由于每次遍历都有可能遍历整棵树,所以时间复杂度最坏为
正解
继续在暴力做法上寻找优化方法。
如果我们画图会发现,一棵子树内前序遍历的编号是连续的。
所以我们就可以利用这一性质,在树的前序遍历上做询问。
先对整棵树跑一边前序遍历并将其记录下来。
在询问时,先找到
最终前序遍历中下标为
对于输出
由于预处理时间复杂度为
代码
#include<stdio.h>
#include<vector>
const int N=2e5+5;
std::vector<int> v[N];
int n,m,num[N],cnt,kth[N],size[N];
void build(int u){//预处理
num[++cnt]=u;//前序遍历编号对应元素
kth[u]=cnt;//元素对应编号
size[u]=1;//子树大小
for(auto son:v[u]) build(son),size[u]+=size[son];
}
int main(){
scanf("%d%d",&n,&m);
for(int i=2,x;i<=n;i++) scanf("%d",&x),v[x].emplace_back(i);
build(1);
int x,y;
while(m--){
scanf("%d%d",&x,&y);
if(size[x]<y) puts("-1");
else printf("%d\n",num[kth[x]+y-1]);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】