当前位置:网站首页>[CodeForces - 208E] Blood Cousins(k代兄弟问题)
[CodeForces - 208E] Blood Cousins(k代兄弟问题)
2022-04-23 06:21:00 【Zimba_】
题意:
给定一棵 n n n个结点的树。给出 m m m次询问,每次询问给出 x x x和 k k k,问 x x x有多少个 k k k代兄弟。(两个点互为 k k k代兄弟的定义是他们的 k k k级祖先相同)
1 ≤ n , m ≤ 1 0 5 1\leq n,m \leq 10^{5} 1≤n,m≤105
做法:
把所有点以深度为第一关键字, d f s dfs dfs序为第二关键字排序。然后 k k k代兄弟一定是在一段连续的区间中的,这样就转化成区间问题了。
这题的话,排好序后,对询问点二分出左右边界,就可以找到它的所有 k k k代兄弟了。
(加强版是求 k k k代兄弟中的第 k k k大,用主席树维护一下区间的就好了)
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>v[100005];
int id[100005],idx,dep[100005],fa[100005][20];
void dfs(int x,int pre)
{
if(x==0)dep[x]=0,fa[x][0]=0;
else dep[x]=dep[pre]+1,fa[x][0]=pre;
if(x!=0)id[x]=++idx;
for(auto to:v[x])
{
if(to!=pre)
{
dfs(to,x);
}
}
}
bool cmp(int a,int b)
{
if(dep[a]!=dep[b])return dep[a]<dep[b];
else return id[a]<id[b];
}
int getK(int x,int k)
{
for(int i=0;i<=18;i++)if((k>>i)&1)x=fa[x][i];
return x;
}
int idd[100005];
int wei[100005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
idd[i]=i;
int x;
scanf("%d",&x);
v[x].push_back(i);
v[i].push_back(x);
}
dfs(0,-1);
for(int i=1;i<=18;i++)
{
for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1];
}
sort(idd+1,idd+n+1,cmp);
for(int i=1;i<=n;i++)wei[idd[i]]=i;
int m;
scanf("%d",&m);
while(m--)
{
int x,k;
scanf("%d%d",&x,&k);
int f=getK(x,k);
if(f==0){
printf("%d\n",0);continue;}
int led,red;
int l=1,r=wei[x];
while(l<r)
{
int p=(l+r)/2;
if(getK(idd[p],k)==f)r=p;
else l=p+1;
}
led=l;
l=wei[x],r=n;
while(l<r)
{
int p=(l+r+1)/2;
if(getK(idd[p],k)==f)l=p;
else r=p-1;
}
red=l;
printf("%d\n",red-led+1-1);
}
return 0;
}
版权声明
本文为[Zimba_]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43785386/article/details/108207098
边栏推荐
- Wireless communication system for large-scale sports events
- Discussion on the outline of short video technology
- Urban emergency management - urban emergency communication command and dispatching system
- 开发板如何ping通百度
- Solution of wireless intercom system in Commercial Plaza
- 技术小白的第一篇(表达自己)
- 社区版阿里MQ普通消息发送订阅Demo
- LATEX使用
- Object. Create() principle, object Create() specification, handwritten object create(),Object. Create() usage
- Lead the industry trend with intelligent production! American camera intelligent video production platform unveiled at 2021 world Ultra HD Video Industry Development Conference
猜你喜欢
随机推荐
van-uploader上传图片实现过程、使用原生input实现上传图片
保洁阿姨都能看懂的中国剩余定理和扩展中国剩余定理
pytorch:关于GradReverseLayer实现的一个坑
如何将进程绑定到指定的CPU上
特殊成员与魔法方法
浅谈BFC(块格式化上下文)
开发板如何ping通百度
go语言映射操作
Solution of self Networking Wireless Communication intercom system in Beifeng oil and gas field
USO technology was invited to share the technical framework and challenges of AI synthetic virtual characters at lvson2020 conference
可视化常见绘图(四)柱状图
数论之拓展欧几里得
记录一些npm 有关的问题(杂乱记录)
Machine vision series (01) -- Overview
Statement of American photography technology suing Tianmu media for using volcanic engine infringement code
PyTorch 20. Pytorch tips (continuously updated)
P2257 YY的GCD(莫比乌斯反演)
学习笔记7-深度神经网络优化
HuggingFace
学习笔记6-几种深度学习卷积神经网络的总结