[ABC264Ex] Perfect Binary Tree
Problem Statement
We have a rooted tree with $N$ vertices numbered $1,2,\dots,N$.
The tree is rooted at Vertex $1$, and the parent of Vertex $i \ge 2$ is Vertex $P_i(<i)$.
For each integer $k=1,2,\dots,N$, solve the following problem:
There are $2^{k-1}$ ways to choose some of the vertices numbered between $1$ and $k$ so that Vertex $1$ is chosen.
How many of them satisfy the following condition: the subgraph induced by the set of chosen vertices forms a perfect binary tree (with $2^d-1$ vertices for a positive integer $d$) rooted at Vertex $1$?
Since the count may be enormous, print the count modulo $998244353$.
What is an induced subgraph?
Let $S$ be a subset of the vertex set of a graph $G$. The subgraph $H$ induced by this vertex set $S$ is constructed as follows:
- Let the vertex set of $H$ equal $S$.
- Then, we add edges to $H$ as follows:
- For all vertex pairs $(i, j)$ such that $i,j \in S, i < j$, if there is an edge connecting $i$ and $j$ in $G$, then add an edge connecting $i$ and $j$ to $H$.
What is a perfect binary tree?
A perfect binary tree is a rooted tree that satisfies all of the following conditions:
- Every vertex that is not a leaf has exactly $2$ children.
- All leaves have the same distance from the root.
Here, we regard a graph with \(1\) vertex and \(0\) edges as a perfect binary tree, too.
Constraints
- All values in input are integers.
- $1 \le N \le 3 \times 10^5$
- $1 \le P_i < i$
Input
Input is given from Standard Input in the following format:
$N$
$P_2$ $P_3$ $\dots$ $P_N$
Output
Print $N$ lines.
The $i$-th ($1 \le i \le N$) line should contain the answer as an integer when $k=i$.
Sample Input 1
10
1 1 2 1 2 5 5 5 1
Sample Output 1
1
1
2
2
4
4
4
5
7
10
The following ways of choosing vertices should be counted:
- $\{1\}$ when $k \ge 1$
- $\{1,2,3\}$ when $k \ge 3$
- $\{1,2,5\},\{1,3,5\}$ when $k \ge 5$
- $\{1,2,4,5,6,7,8\}$ when $k \ge 8$
- $\{1,2,4,5,6,7,9\},\{1,2,4,5,6,8,9\}$ when $k \ge 9$
- $\{1,2,10\},\{1,3,10\},\{1,5,10\}$ when $k = 10$
Sample Input 2
1
Sample Output 2
1
If $N=1$, the $2$-nd line of the Input is empty.
Sample Input 3
10
1 2 3 4 5 6 7 8 9
Sample Output 3
1
1
1
1
1
1
1
1
1
1
Sample Input 4
13
1 1 1 2 2 2 3 3 3 4 4 4
Sample Output 4
1
1
2
4
4
4
4
4
7
13
13
19
31
先考虑如果不带实时询问怎么做?定义 \(dp_{i,j}\) 为以 \(i\) 为节点,深度为 \(j\) 的导出完全二叉树有多少个。发现 \(j\) 是 \(logn\) 级别的,因为一个 \(j\) 层完全二叉树的节点数量是 \(2^j\) 级别,而节点数量要 \(\le n\)。
用 \(son\) 表示 \(i\) 的所有儿子的集合, 初始化 \(dp_{i,0}=1\)$$dp_{i,j}=\sum\limits_{v1\in son}\sum\limits_{v2>v1,v2\in son}dp_{v1,j-1}\times dp_{v2,j-1}$$
这个可以化简为 $$(\sum\limits_{v\in son}dp_{v,j-1})^2-\sum\limits_{v\in son}dp_{v,j-1}^2$$
这个东西就可以实现树上 \(O(1)\) 转移了,最终答案为 \(\sum\limits_{j=0}^{logn}dp_{1,j}\),总复杂度 \(O(nlogn)\)
现在要求加点,询问。那么思路很简单,首先如果一个点的层数大过 \(logn\),他影响不到答案。然后考虑不断往上爬,去更改会改变的答案。
要直接维护 \(dp\) 值不容易,考虑维护所有 \(dp\) 值的和还有平方和,有这两个更改我们可以推出 \(dp\) 值的更改。然后发现,如果现在加入点 \(x\) 的时候,点 \(y\) 与点 \(x\) 的层数差为 \(a\),那么只有 \(dp_{y,a}\) 有可能更改,加上 \(x\) 的层数 \(\le logn\),所以这样子改的复杂度是 \(O(logn)\) 的。具体更改时就是减去旧的加上新的就行了。
#include<cstdio>
const int N=3e5+5,P=998244353,inv2=499122177;
typedef long long LL;
long long s[N][25],f[N][25],dp[N][25],ans,dep[N];//s表示和,f表示平方和
int n,k,fa[N];
void dfs(int x,int y,LL a,LL b)//a表示原来的,b表示新的
{
LL k=dp[x][y];
(s[x][y]+=b-a+P)%=P;
(f[x][y]+=b*b%P-a*a%P+P)%=P;
dp[x][y]=(s[x][y]*s[x][y]%P-f[x][y]+P)*inv2%P;
if(x-1)
dfs(fa[x],y+1,k,dp[x][y]);
}
int main()
{
scanf("%d",&n);
dp[1][0]=1;
puts("1");
for(int i=2;i<=n;i++)
{
scanf("%d",fa+i),dep[i]=dep[fa[i]]+1;
f[i][0]=dp[i][0]=s[i][0]=1;
if(dep[i]<=20)
dfs(fa[i],1,0,1);
// puts("qzmakioi");
ans=0;
for(int j=0;j<=20;j++)
(ans+=dp[1][j])%=P;
printf("%lld\n",ans);
}
}
[ABC264Ex] Perfect Binary Tree的更多相关文章
- Types of Binary Tree
Complete Binary Tree According to wiki, A complete binary tree is a binary tree in which every level ...
- BFS广度优先 vs DFS深度优先 for Binary Tree
https://www.geeksforgeeks.org/bfs-vs-dfs-binary-tree/ What are BFS and DFS for Binary Tree? A Tree i ...
- [LeetCode] 543. Diameter of Binary Tree 二叉树的直径
Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode, construct binary tree from inorder and post order traversal
Sept. 13, 2015 Spent more than a few hours to work on the leetcode problem, and my favorite blogs ab ...
- [LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点
Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...
- [LeetCode] Verify Preorder Serialization of a Binary Tree 验证二叉树的先序序列化
One way to serialize a binary tree is to use pre-oder traversal. When we encounter a non-null node, ...
- [LeetCode] Binary Tree Vertical Order Traversal 二叉树的竖直遍历
Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...
- [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
随机推荐
- 开源Word文字替换小工具更新 增加文档页眉和页脚替换功能
ITGeeker技术奇客发布的开源Word文字替换小工具更新到v1.0.1.0版本啦,现已支持Office Word文档页眉和页脚的替换. 同时ITGeeker技术奇客修复了v1.0.0.0版本因替换 ...
- Unity UGUI的Slider(滑动条)件组的介绍及使用
Unity UGUI的Slider(滑动条)件组的介绍及使用 1. 什么是Slider组件? Slider(滑动条)是Unity UGUI中的一种常用UI组件用,于在用户界面中实现滑动选择的功能.通过 ...
- 【NestJS系列】核心概念:Module模块
theme: fancy highlight: atelier-dune-dark 前言 模块指的是使用@Module装饰器修饰的类,每个应用程序至少有一个模块,即根模块.根模块是Nest用于构建应用 ...
- Go 如何正确关闭通道
序言 Go 在通道这一块,没有内置函数判断通道是否已经关闭,也没有可以直接获取当前通道数量的方法.所以对于通道,Go 显示的不是那么优雅.另外,如果对通道进行了错误的使用,将会直接引发系统 panic ...
- 云原生 | 企业内使用 CoreDNS 构建高性能、插件化的DNS服务器
[点击 关注「 全栈工程师修炼指南」公众号 ] 设为「️ 星标」带你从基础入门 到 全栈实践 再到 放弃学习! 涉及 网络安全运维.应用开发.物联网IOT.学习路径 .个人感悟 等知识分享. 希望各位 ...
- 从Google开发者大会浅谈LLM的应用
这周参加了在上海世博中心举办Google I/O Connect中国开发者大会,有几年没参加这么高质量的活动,有点感慨. 期间重点听了关于GCP和Google AI大语言模型的主题演讲,发现目前各大厂 ...
- 文心一言 VS 讯飞星火 VS chatgpt (90)-- 算法导论8.3 3题
三.用go语言,利用归纳法来证明基数排序是正确的.在你所给出的证明中,在哪里需要假设所用的底层排序算法是稳定的? 文心一言: 基数排序是一种非比较型整数排序算法,其通过在每一位上进行比较来排序.基数排 ...
- 使用KRPano资源分析工具强力加密JS文件
本文地址:http://www.cnblogs.com/reachteam/p/6294767.html 软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278 ...
- 【SpringBoot实战】开发入门--快速创建springboot程序
前言 本片博客记录快速创建springboot工程的使用spring initializr创建.开发环境JDK1.8.IDEA.maven. SpringBoot 优点 可快速构建spring应用 直 ...
- MySQL到TiDB:Hive Metastore横向扩展之路
作者:vivo 互联网大数据团队 - Wang Zhiwen 本文介绍了vivo在大数据元数据服务横向扩展道路上的探索历程,由实际面临的问题出发,对当前主流的横向扩展方案进行了调研及对比测试,通过多方 ...