首页 > TAG信息列表 > Cousins
【数据结构】二叉树的堂兄弟 Cousins in Binary Tree
目录二叉树的堂兄弟 Cousins in Binary Tree思路Tag 二叉树的堂兄弟 Cousins in Binary Tree 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的E. Blood Cousins Return (树上启发式合并维护set)
传送门 给定了一个森林,每棵树都是有根树,m次询问,每次询问节点x的k级后代中,有多少个互不相同的名字。 对于第i层,维护一个set表示这层的名字集合,达到去重效果。 把查询离线,然后dsu on tree即可。 #include<bits/stdc++.h> using namespace std; //#pragma GCC optimize(2) #defiBlood Cousins Return
[https://codeforces.com/problemset/problem/246/E] (点此看题) 简要题面: 一棵树上有n个节点,每个节点有对应的名字(名字可重复)。 每次询问,求深度比$vi$多$ki$的$vi$的儿子中,有多少种名字 分析: Step1: 我们可以懂$DFS$轻松找到每个节点的深度dep[x], 同时用$DFS$序列得知每个节CF208E Blood Cousins - 树
题意 给你一片森林,每次询问某个点与多少个点有相同的 \(k\) 级祖先。 点数、询问数 \(\le 10^5\)。 题解 将所有树的根节点连向点 \(0\),使得整个森林变成一棵树。 先离线地求出每个询问点的 \(k\) 级祖先。用栈维护每个点到点 \(0\) 的路径上的所有点,那么其 \(k\) 级祖先就是这些CF208E Blood Cousins(树上启发式合并)
转化题目,题目要求的是K级祖先,我们可以对于每个询问先跳到祖先,那么就是求对于这个祖先,depth[u]+k的个数是多少个,然后-1就是答案 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; int rt,f[N][25]; int dept208E.Blood Cousins(离线+倍增LCA+树上启发式合并)
给出一个树。 每次询问第x点有多少y代表亲。 两个点互为y代表亲当且仅当它们的第y个祖先相同。 题解: 每个点的y代表亲的答案就是: 先向上找节点的第y个祖先,这个祖先子树内的第dep+y层节点总数就是答案。 那么就可以先对询问离线,然后用倍增LCA找到每个点的第y层祖先,记录dep+y和询问[CF208E] Blood Cousins - dsu on tree, LCA
[CF208E] Blood Cousins - dsu on tree, LCA Description 给你一片森林,每次询问一个点与多少个点拥有共同的 K 级祖先。 Solution dsu on tree 首先,求出一个点的 k 级祖先,并且把询问挂在他身上,问的就是这个点 p 子树内有多少个深度为 d 的点 在 dfs 过程中,对每个点,递归处理各个孩Blood Cousins dsu on tree + k祖先查询
题意 给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor。多次查询,给出 u k,问有多少个与 u 具有相同 k-ancestor 的节点。 分析 这个问题我们可以离线去查询 首先我们先把每一个查询节点的k-ancesto处理出来,然后就把这个问题转化成求节点x的子树中,比他深度CodeForces - 246E Blood Cousins Return
Solution \(CF\) 的数据是真的多而且慢。 开个 \(map\) 记录就行了。这里在实现上有一个小坑:我注释里面是错误写法,因为第二个 \(if\) 可能会有 \(2->1\) 的情况。 Code #include <map> #include <cstdio> #include <vector> #include <iostream> using namespace std; const intCodeForces 208E. Blood Cousins【树上启发式合并】
传送门 题意 给一片森林,\(m\) 次查询,询问每个节点与其它多少个节点有共同的第 \(k\) 祖先。 题解 对于这种无修改的询问题目,直接离线询问。 把每个询问中那个第 \(k\) 祖先用倍增求出来,然后问题转化为问第 \(k\) 祖先的子树中有多少个点与询问的点同深度。这个问题可以用树上启发CF246E Blood Cousins Return [dsu on tree 树上启发式合并]
#include <bits/stdc++.h> using namespace std; // int read() { // int x = 0; // char c = getchar(); // while (c < 48) c = getchar(); // while (c > 47) x = x * 10 + (c - 48), c = getchar(); // return x; //} int n, q; const int maxn = 2e5 +LeetCode.993-二叉树中的堂兄弟(Cousins in Binary Tree)
这是悦乐书的第374次更新,第401篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第235题(顺位题号是993)。在二叉树中,根节点在深度0处,并且每个深度为k的节点的子节点,他们深度为k + 1。 如果二元树的两个节点具有相同的深度但具有不同的父节点,则它们是堂兄弟。 我们给出(二叉树 BFS) leetcode993. Cousins in Binary Tree
In a binary tree, the root node is at depth 0, and children of each depth knode are at depth k+1. Two nodes of a binary tree are cousins if they have the same depth, but have different parents. We are given the root of a binary tree with unique values,