hdu5288 多校

题意:f(l,r)表示i的数量,i满足(l=<i<=r)且没有不存在任何一个j,j!=i,且ai mod aj=0;求那个题目中的公式结果。题意还是挺好理解,不理解的可以看看样例画画就知道了。


思路:假设有一个序列元素为 a b c d e f;且a,f是d的因数,bce都不是d的因数。则在bcde这个区间段,任意包含d的区间d都是可以贡献一个答案值的,比如本例中bcd bcde cd cde de d 这6个序列中计算f(l,r)函数时d都是可以一个统计量。所以对于每一个数组中的元素只需找到其左右最靠近的因数在哪个位置即可。若ai在数组下标为i,且ai前最近的因数位置在l,ai后最近的因数是r,那么ai总共可以贡献的统计量为(i-l)*(r-i);现在的问题是如何快速确定每一个数的最近左因数和最近右因数。可以从左往右扫描数组,比如扫描到ai时,1*ai,2*ai,3*ai......j*ai(j*ai<10000因为数据范围就到10000)的l都要修改为i,对于r的确定当然就是从右往左扫描,解决详看代码

http://paste.ubuntu.com/11918563/


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值