【BestCoder #48】
与之前一样,秒刷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)