问题转化
公司层级结构是一棵深度为 n 的完全二叉树,节点编号规则为:根节点编号 1,节点 i 的左子节点为 2i,右子节点为 2i+1。
每次通知某个成员 ai 后,以 ai 为根的整棵子树都会被标记为“已通知”。
我们需要在每次操作后,快速统计整棵树中已经被通知的节点总数。
利用 DFS 序将子树转化为连续区间
对完全二叉树进行先序遍历(根 → 左 → 右),每个节点都有一个唯一的 DFS 序(从 0 开始编号)。
一家公司具有严格的树形层级结构,由一位最高负责人和其下属构成,形成一棵深度为 n 的完全二叉树。负责人编号为 1,对于任意编号为 i 的成员(如果其存在下级),他的直接下级编号分别为 2i 和 2i+1。成员总数不超过 2n−1。
初始时,所有成员均未接收某项重要通知。接下来会进行 q 次通知下达,每一次操作会指定一个成员编号 ai,该成员及其所有下属(即以该成员为根的子树)将立即标记为“已通知”。如果某个成员此前已被通知,则状态保持不变。请你在每一次通知下达后,计算当前已通知的成员总数。
约束:层数 n≤40,操作次数 q≤104,每次下达的编号 ai 满足 1≤ai≤2n。
第一行包含两个整数 n 和 q,分别表示树的层数和操作次数。 接下来 q 行,每行一个整数 ai,表示本次下达通知的成员编号。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册