LOJ #2302. 「NOI2017」整数
题目叙述
给一个数每次加上 \(a\cdot 2^b\) ,或者求出这个数二进制下第 \(k\) 位是多少。\(a\) 正负都有。
题解
考虑到“进一位数字和少9”这件事情,如果只有加法,那么进位次数不会太多。
因此考虑加法减法分别维护两个数,考虑竖式的过程,实际上就是查询两个位置的第 \(k\) 位是多少和前面那些位置的大小关系。
问题在于查询前面那些位置的大小关系。这可以考虑用一个 set 维护这些位置前面哪些位置不同。找到第一个不同的位置,然后判断大小。
为了常数小一点,可以30个二进制位压成一个 unsigned 类型。
总结
- 两个方向都有的势能分析题,考虑两个方向分别维护。
- 进制相关的问题,把进制扩大不失为一种减小常数的方法。