位操纵:更难掷硬币
Bit Manipulation: Harder Flipping Coins
最近,我从CodeChef看到了这个问题,标题为"翻硬币"(链接:FLIPCOINS)。
总而言之,有N个硬币,我们必须编写一个支持两个操作的程序。
- 在范围 [A,B] 中掷硬币
- 分别查找范围 [A、B] 中的磁头数。
当然,我们可以快速使用区段树(范围查询,使用延迟传播的范围更新)来解决这个问题。
然而,我遇到了另一个类似的问题,在一系列翻转(操作 1)之后,我们需要在翻转后输出硬币的结果排列(例如100101,其中 0 代表正面,1 代表反面)。
更具体地说,操作 2 从计算正面数量变为产生所有 N 个硬币的结果排列。此外,只有在完成所有翻转后才会调用新操作 2(即操作 2 是最后一个调用的,并且只调用一次)。
我可以知道如何解决这个问题吗?根据问题标签,它需要某种形式的位操作。
编辑
我尝试暴力破解所有查询,唉,它产生了超过时间限制。
打印出硬币的状态可以使用二进制索引树来完成:
- 最初,所有值都
0
。 - 当我们需要
[A, B]
抛硬币时,我们将A
递增1
和 递减B + 1
1
. - 硬币
i
的状态是i
模2
的前缀和。
这是有效的,因为i
处的前缀总和始终是在i
处完成的翻转操作数。
相关文章:
- 最小硬币更换问题(自上而下方法)
- C++setiosflags函数操纵器-未确定的缩进
- 如何在硬币兑换问题中找到硬币的数量
- C++表达SFINAE和ostream操纵器
- 操纵安卓相机的深度图导致应用程序崩溃
- 硬币兑换:找到多种方法来重现给定的总和
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 在 c++ 中模拟抛硬币时,模数如何工作?
- 用给定面值的最小硬币数量计价金额.贪婪的问题
- 抛硬币计数游戏C++数据结构!.
- 如何在硬币兑换中添加记忆
- 有关具有编译错误的操纵列表的问题
- C++自定义流操纵器,用于更改流上的下一个字符串
- 如何使用自定义流操纵器在类实例中保存数据
- 使用OpenCV计数硬币
- 如何键入用于const对象的自定义io操纵器
- 如何实现接受参数的自定义流操纵器?
- 如何缩短此C++代码?(硬币兑换计算器)
- I/O 操纵器错误或临时延长寿命由 const 参考?
- 位操纵:更难掷硬币