题目描述
九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜欢的就是线段树。
线段树的核心是懒标记,下面是一个带懒标记的线段树的伪代码,其中 数组为懒标记:

其中函数 表示 的左儿子, 表示 的右儿子。
现在可怜手上有一棵 上的线段树,编号为 。这棵线段树上的所有节点的 均为 。接下来可怜进行了 次操作,操作有两种:
- ,假设可怜当前手上有 棵线段树,可怜会把每棵线段树复制两份( 数组也一起复制),原先编号为 的线段树复制得到的两棵编号为 与 ,在复制结束后,可怜手上一共有 棵线段树。接着,可怜会对所有编号为奇数的线段树进行一次 。
- ,可怜定义一棵线段树的权值为它上面有多少个节点 为 。可怜想要知道她手上所有线段树的权值和是多少。
输入格式
第一行输入两个整数 表示初始区间长度和操作个数。
接下来 行每行描述一个操作,输入保证 。
输出格式
对于每次询问,输出一行一个整数表示答案,答案可能很大,对 取模后输出即可。
样例输入
样例输出
解题思路
一道可写的简单线段树题
经过 次 操作后,将有 棵线段树
将线段树合起来看,将线段树中一个节点编号为 的 为 的概率记为 ,那么答案就为
考虑 操作对答案的影响,我们先回顾这道题 的写法
因为有 操作,我们考虑用 表示节点编号为 和父亲节点 中至少有一个 为 的概率
情况一:假如这个区间被完全覆盖
因为每一次修改只修改一半的线段树,没有被修改的对答案的贡献是 和 ,被修改的对答案的贡献是 和
情况二:假如进行了 操作
被修改的线段树中,进行了 的线段树区间 一定是 ,并且从根到这个区间路径上所有节点的 都应该是
所以这一半线段树对答案的贡献是 和
情况三:假如进行了 ,但子区间不符合递归 的条件
那么显然只对左儿子区间或右儿子区间的 造成了影响,对答案的贡献是
而 是不变的
情况四:由于 或赋值操作,父区间 被赋值为
这对区间的 本身是没有影响的,影响只是 ,这一部分对答案的贡献是
但是这种情况出现次数可能会很多,比如出现一次情况一,就会对其所有子树有影响
但我们发现每个子区间的权值都是乘上 后加上
因此可以线段树维护 标记和 标记解决
代码
加载更多