NOI2017 整数

压位线段树做法挺泛滥的,mark一个在网上看到的神奇做法吧。

首先a有正负,所以相当于有加有减。就可以把加数加在一起,减数加到一起。每次查询就把当前的这两个高精度二进制s1与s2(stl术语叫bitset?)相减,就是答案。

至于怎么加呢?给出的方案是:把a拆成若干二进制的和,给那一位加1,然后暴力进位。因为你想,最惨的情况就是一串1,这样的话就很讨厌。但是,在进位之后又都变成0了。所以复杂度是均摊的!!!(神奇吧)

那如何相减?依旧暴力吗?并不。因为最忌讳的有加有减,就比如(1<<30) - 1这个数,我给它+1、-1、+1、-1……能把人烦死。

因为查询只是查第k位,所以只需要用到位权为1<<i的位(i∈[0, k])。讨论一下要不要进位,于是问题就变成了,查询s1的0~k-1位与s2的0~k-1位的大小关系。

这里可以线段树走一走。

代码比压位短多了!!!代码丑,去观摩百度搜索的第二个人的吧。

压位算法的题解:感谢elijahqi大佬点拨

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值