码迷,mamicode.com
首页 > 其他好文 > 详细

【BestCoder #48】

时间:2015-07-19 17:48:30      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:

与之前一样,秒刷A和B,然后就永远卡在了C

B也因为少看一句话被Hunt掉了

说说C的做法吧(分块大法好

给定一个序列,每次询问区间l-r,求∑(ai^bi),其中bi是指ai在区间中的出现次数,ai是指有在区间中出现的数。

先把官方的正解贴出来:

技术分享

然后我用自己的话来说一下。。

分块,首先预处理出h(i,j)和g(a,b),各自的复杂度一个为n^1.5,一个多加上快速幂的logn

h的话你可以求出每个块所含有的数 O(块数*块内元素数=n),然后再前缀和累加起来 O(值域*块数=n^1.5)

g的话直接利用正解说的方法暴力求一下 O(块数*块数*块内元素数*计算时间=n^1.5*logn)

对于询问,我们可以将分块完剩余的两端暴力求出各个数的出现次数,然后与中间整块的答案合并 O(块内元素数*计算时间=n^0.5*logn)

对于快速幂所带来的log,我们预处理出所有有可能要计算的幂就行了,用vector存的话空间也不是问题 O(n)

总的复杂度就是O(n^1.5+Q*n^1.5)

技术分享

【BestCoder #48】

标签:

原文地址:http://www.cnblogs.com/NanoApe/p/4658921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!