题目链接:https://codeforces.com/contest/208/problem/E

题意:n个节点,组成森林。m个询问,一个询问由(v,p)组成,问v的p-cousin有多少,v的p-cousin(v1)指v,v1在同一层且他们和LCA(v,v1)距离为p。

思路:将询问转化为子树上,对于一个询问(v,p),我们从下往上找v的第p个祖先(u)[我用的倍增],那么询问的答案就是问u的子树中,深度为deep[u]+p节点的个数-1。维护每个深度有多少节点即可。

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+10;
int n,m;
struct edge{int to,nex;
}g[N];
int head[N],cnt=0;
struct node{int id,dep,nex;
}q[N];
int head1[N],cnt1=0;
bool book[N];
void add(int u,int v){g[cnt]=edge{v,head[u]};head[u]=cnt++;
}
int sz[N],son[N],dep[N],f[N][25];
void getsz(int u){int mx=-1;sz[u]=1;for(int i=1;(1<<i)<=n;i++)f[u][i]=f[f[u][i-1]][i-1];for(int i=head[u];~i;i=g[i].nex){int v=g[i].to;f[v][0]=u;dep[v]=dep[u]+1;getsz(v);sz[u]+=sz[v];if(sz[v]>mx){son[u]=v;mx=sz[v];}}
}
int getf(int u,int dis){for(int i=20;i>=0;i--)if(dis&(1<<i))u=f[u][i];return u;
}
void add1(int u,int id,int de){q[cnt1]=node{id,de,head1[u]};head1[u]=cnt1++;
}
int num[N],SON;
void dfs1(int u,int x){num[dep[u]]+=x;for(int i=head[u];~i;i=g[i].nex){int v=g[i].to;if(v==SON) continue;dfs1(v,x);}
}
int ans[N];
void dfs(int u,bool keep){for(int i=head[u];~i;i=g[i].nex){int v=g[i].to;if(v==son[u]) continue;dfs(v,0);}if(son[u]!=-1){dfs(son[u],1);SON=son[u];}dfs1(u,1);SON=0;for(int i=head1[u];~i;i=q[i].nex)ans[q[i].id]=num[q[i].dep]-1;if(!keep) dfs1(u,-1);
}
int main(void){scanf("%d",&n);for(int i=1;i<=n;i++)son[i]=head1[i]=head[i]=-1;for(int i=1;i<=n;i++){int u;scanf("%d",&u);if(u) add(u,i);book[i]=(u==0);}for(int i=1;i<=n;i++)if(book[i]){dep[i]=1;getsz(i); }scanf("%d",&m);for(int i=1;i<=m;i++){int u,k;scanf("%d%d",&u,&k);if(dep[u]>k){int x=getf(u,k);add1(x,i,dep[u]);}}for(int i=1;i<=n;i++)if(book[i])dfs(i,0);for(int i=1;i<=m;i++)   printf("%d%c",ans[i],i==m?'\n':' ');    return 0;
} 

CF 208E Blood Cousins (dus on tree)相关推荐

  1. CF 246E. Blood Cousins Return [dsu on tree STL]

    题意: 一个森林,求k级后代中多少种不同的权值 用set维护每个深度出现的权值 一开始一直在想删除怎么办,后来发现因为当前全局维护的东西里都是当前子树里的,如果要删除那么当前一定是轻儿子,直接清空se ...

  2. LSM树(Log-Structured Merge Tree)存储引擎

    LSM树(Log-Structured Merge Tree)存储引擎 代表数据库:nessDB.leveldb.hbase等 核心思想的核心就是放弃部分读能力,换取写入的最大化能力.LSM Tree ...

  3. js 数组 实现 完全树_算法和数据结构 | 树状数组(Binary Indexed Tree)

    本文来源于力扣圈子,作者:胡小旭.点击查看原文 力扣​leetcode-cn.com 树状数组或二叉索引树(英语:Binary Indexed Tree),又以其发明者命名为 Fenwick 树.其初 ...

  4. 数据结构与算法(C++)– 二叉查找树(Binary Search Tree )

    数据结构与算法(C++)– 二叉查找树(Binary Search Tree ) 1.二叉查找树(BST) 定义: 假设二叉树的节点都是不同的数,对于树点的任一节点,它的左子树都小于它,它的右子树都大 ...

  5. 问题六十四:怎么用C++实现二叉查找树(binary search tree)及其相关操作

    64.0 概述 什么是二叉查找树(binary search tree)? 二叉查找树(binary search tree)又叫二叉排序树(binary ordered tree). 对于任意二叉查 ...

  6. 平衡二叉树(Balanced Binary Tree)

    平衡二叉树(Balanced Binary Tree) 平衡二叉树(Balanced Binary Tree)又称AVL树.AVL 树得名于它的发明者 G. M. Adelson-Velsky 和 E ...

  7. MPT(Merkle Patricia Tree)树结构示例

    MPT(Merkle Patricia Tree): 参考深入浅出以太坊MPT(Merkle Patricia Tree) MPT树结构示例1: rootHash扩展节点 prefix 0 prefi ...

  8. 基于tiny4412的Linux内核移植(支持device tree)(二)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  9. JS 实现红黑树(Red Black Tree)

    文章目录 JS 实现红黑树(Red Black Tree) 前言 概念 树的定义 插入操作 疑问一:新增结点是红是黑 插入,简单记录 删除操作 删除结点 平衡结点 单边结点 叶子结点 结语 代码 JS ...

最新文章

  1. 自创数据集,用TensorFlow预测股票教程 !(附代码)
  2. log4net按照不同的【LEVEL】级别输出到不同文件
  3. linux怎么远程windows桌面,Windows系统怎么远程登陆桌面Linux?
  4. java -cp ***.jar WordCount 无法找到类名解决方案记录
  5. Community Server系列之四:Ajax在CS2.0中的应用1
  6. 计算机一级办公软件试题,计算机一级《MS Office》练习题(含答案)
  7. js文件中调用另一个js文件:
  8. java 多线程系列基础篇(二)
  9. 腾讯QQ看点信息流推荐业务:内容分发场景的多目标架构实践
  10. redist mysql_redist命令操作(三)--集合Set
  11. mysql 创建聚集索引_索引为什么会加快Mysql的查询速度?
  12. L01-03:python学习之控制语句
  13. php获取随机的六位数,php生成随机六位数密码代码
  14. android+自定义跑马灯,Android自定义图文跑马灯效果
  15. 免费地图制作软件,在线做地图的平台推荐
  16. mysql套接字连接_无法通过Remote上的套接字连接到本地MySQL服务器
  17. 麻将编程c语言,C语言麻将算法(胡牌算法)
  18. 如何看待“英特尔是一家软件公司”?
  19. 什么是GPU,GPU怎么工作的,什么是图形的渲染,渲染怎么完成的。
  20. 【Oracle SQL数据库-教学2】--- Oracle数据库基础

热门文章

  1. Win7延长激活时间方法(微软官方文档)
  2. 人物关键点位打马赛克(图片)
  3. 斯坦福大学计算机科学phd,斯坦福大学计算机科学专业
  4. ITERATE MYSQL 例子,MySQL 使用 LOOP 的 ITERATE 语句示例
  5. ibatis mysql iterate_ibatis中iterate问题的解决 | 学步园
  6. 电影《南京》观后感 -- 一个遗忘历史的民族终究也会被历史所唾弃
  7. aix 修改服务器时间,AIX修改系统时间
  8. 网络安全通识全解|第18期 DAST、SAST、IAST——Web应用安全测试技术
  9. 技校学计算机当兵,技校毕业证可以当兵吗 有用吗
  10. Python音乐生成:MIDI