当前位置:网站首页>[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
边栏推荐
猜你喜欢

可视化常见绘图(四)柱状图

可视化之路(十一)matplotlib颜色详解

Flexible blind patch of ad hoc network | Beifeng oil and gas field survey solution

DMR system solution of Kaiyuan MINGTING hotel of Fengqiao University

el-date-picker中自定义快捷选项picker-options,动态设置禁用日期

可视化常见问题解决方案(八)共享绘图区域问题解决方案

Solution of emergency communication system for major security incidents

南方投资大厦SDC智能通信巡更管理系统

后台管理系统框架,总有你想要的

Meishe helps Baidu "Duka editing" to make knowledge creation easier
随机推荐
简单易懂的子集dp
可视化之路(十)分割画布函数详解
Hanlp分词器(通过spark)
Metro wireless intercom system
如何将进程绑定到指定的CPU上
海康威视面经总结
Draw margin curve in arcface
自定义钉钉机器人进行报警
P2257 YY的GCD(莫比乌斯反演)
PyTorch 13. Nested functions and closures (dog head)
Tensorflow安装后ImportError: DLL load failed: 找不到指定的模块,且国内安装缓慢
字节数仓实习生面试sql题
推导式与正则式
嵌入式相关面经(一)
菜菜的刷题日记 | 蓝桥杯 — 十六进制转八进制(纯手撕版)附进制转换笔记
可视化常见问题解决方案(七)画图刻度设置解决方案
xdotool按键精灵
数论之阶与原根讲解
go语言数组操作
江宁医院DMR系统解决方案