LOJ #2302. 「NOI2017」整数

题目叙述

给一个数每次加上 \(a\cdot 2^b\) ,或者求出这个数二进制下第 \(k\) 位是多少。\(a\) 正负都有。

题解

考虑到“进一位数字和少9”这件事情,如果只有加法,那么进位次数不会太多。
因此考虑加法减法分别维护两个数,考虑竖式的过程,实际上就是查询两个位置的第 \(k\) 位是多少和前面那些位置的大小关系。
问题在于查询前面那些位置的大小关系。这可以考虑用一个 set 维护这些位置前面哪些位置不同。找到第一个不同的位置,然后判断大小。
为了常数小一点,可以30个二进制位压成一个 unsigned 类型。

总结

  • 两个方向都有的势能分析题,考虑两个方向分别维护。
  • 进制相关的问题,把进制扩大不失为一种减小常数的方法。

代码

提交记录

posted @ 2022-07-30 02:39  YouthRhythm  阅读(14)  评论(0编辑  收藏  举报