CF208E Blood Cousins】的更多相关文章

Blood Cousins 题目描述 小C喜欢研究族谱,这一天小C拿到了一整张族谱. 小C先要定义一下k-祖先. x的1-祖先指的是x的父亲 x的k-祖先指的是x的(k-1)-祖先的父亲 小C接下来要定义k-兄弟 xx的k-兄弟指的是与x的k-祖先相同的人 如果不存在k-祖先那么x没有k-兄弟 小C想问问你,xx到底有多少k-兄弟?小C打算问QQ次这样的问题. 输入格式 第一行11个数nn,表示族谱中的人数,从11开始编号. 接下来一行nn个数,第ii个数r_iri​指的是ii的父亲,如果为0,…
一个奇奇怪怪的复杂度很垃圾的线段树合并解法 通过分析可以发现,要找$x$的$k$辈兄弟,只需要找到$x$的$k$辈祖先,然后查找以该祖先为根的子树中和$x$深度相同的节点个数$-1$即可.也就是说,询问只与深度有关,与具体是哪个节点无关. 具体怎么实现呢?想到dfs处理,显然在遍历过$x$后会回溯到$x$的$k$辈祖先,因此有一个想法,就是在回溯到$x$的$k$辈祖先时执行查询对应的查询就可以了,这样是一个离线的做法.目前的问题就是,如何能在$x$的$k$辈祖先时执行查询. 有一个做法就是提前处…
倍增求出祖先,\(\text{DSU}\)统计 本来想用树剖求\(K\)祖,来条链复杂度就假了 #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <iostream> #include <numeric> #define R(a,b,c) for(register int a = (b); a <= (c); +…
208E - Blood Cousins 题目:给出一棵树,问与节点v的第k个祖先相同的节点数有多少个. 分析: 寻找节点v的第k个祖先,这不就是qtree2简化版吗,但是怎么统计该祖先拥有多少个深度为k的儿子? 我们可以对于深度为d的所有节点放到一个数组中,这时需要知道的是深度为d的数组中某个连续区间都属于该子树的长度. 某棵子树的信息?这时可以考虑一下dfs序列... dfs序列把整棵子树放在同一个区间,不懂dfs序的可以做做这两题: BZOJ 1103 [POI2007]大都市meg,BZ…
[cf contest246] E - Blood Cousins Return time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Polycarpus got hold of a family tree. The found tree describes the family relations of n people, nu…
246E - Blood Cousins Return 题意 给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor,每个节点有名字,名字不唯一.多次查询,给出 u k,问以 u 为根节点的子树下有多少个深度为 dep[u] + k 的节点(dep[u] 为节点 u 的深度). 分析 和208E - Blood Cousins几乎相同,把那题的 \(C\) 数组换成一个 \(set\) 数组,表示某子树下同一深度所有名字的集合. code #include<bit…
208E - Blood Cousins 题意 给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor.多次查询,给出 u k,问有多少个与 u 具有相同 k-ancestor 的节点. 分析 设 rt 为 u 的 k-ancestor.问题可以转换成在以 rt 为根的子树下,有多少个节点的深度与 u 相同. 预处理出离 u 距离为 k 的祖先 rt . 我们可以把所有的查询用向量存起来(祖先节点,要查询的节点的深度,对应查询的id),在遍历到某个祖先节点时,统计…
题目链接 Blood Cousins Return #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) ; string s[N]; int ans[N], sz[N], h[N]; bool skip[N]; vector <int> v[N]; vector < pair<int, int> > query[…
题目大意:给定一个 N 个点的森林,M 个询问,每次询问对于点 u 来说,有多少个点和 u 有相同的 K 级祖先. 题解:线段树合并适合处理子树贡献的问题. 发现要回答这个询问在点 u 处计算很困难,但是在 u 的 k 级祖先处处理询问很简单,即:问对于 v 子树中深度为 k 的节点的个数.因此,采用将询问离线,对于每个点的询问转化到其祖先节点,最后采用线段树合并即可. 代码如下 #include <bits/stdc++.h> #define mp make_pair #define pb…
题意:给出一个森林,求和一个点有相同k级祖先的点有多少 倍增求父亲然后和上题一样还不用哈希了... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; typedef long long ll; #define pii pair<int, int> #de…