hdu 5358(尺取法)

解题思路:这题可以利用尺取法,不过需要两个指针。如果采用一个指针,会出现这种情况,由于是取对数,所以中间可能会有很多log2S(i,j)的值相等,如果只有一个指针,会使得一些区间没有被算进去。比如0,0,1,1,0这种情况。

正解:

1、首先把它展开。发现没啥用。

2、然后发现S(i,j)最大就是10的十次方。然后一旦log之后,最大就是34貌似。就枚举所有的log值,算出后面乘以多少。这里可以用一种全新的二分姿势。

枚举左端点。好了,现在左端点i固定了。比如从log[S[i,l] ] + 1经过log之后得到k,log[S[i,l+1] ]+ 1 得到的也是k……一直到log[S[i,r-1] ]+1 得到的才是k,然后log[S[i,r] ] + 1 得到的是k+1了。区间是前闭后开的。那么这一段的i和j的总和就是((i + l) + (i+l+1) +  …… (i + r - 1) )那么一共有(r - l )个i+ 等差数列求和公式(a1+an) * n /2   等比数列求和公式:a1 * (1-q^n)/(1-q)


参考博客:http://www.myexception.cn/ai/1985602.html

http://blog.csdn.net/zjck1995/article/details/47321881


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值