简要题意:
给定一个长度为 n n n 的数组 a i a_i ai, T T T 组询问求 [ l , r ] [l,r] [l,r] 区间 随机抽到两个相等的数的概率。
a i , n , T ≤ 5 × 1 0 4 a_i,n,T \leq 5 \times 10^4 ai,n,T≤5×104,时间限制 100 ms 100 \text{ms} 100ms.
首先,这个题当然可以用分块、线段树维护平方和,用奇怪的数据结构解决。
但是我们智商不够,数据结构也凑不上,所以考虑暴力。
暴力?
基于暴力
大力暴力的话,可以达到 O ( n T ) \mathcal{O}(nT) O(nT) 的时间复杂度。其具体实现是,把 [ l , r ] [l,r] [l,r] 区间的每个数拿出来做成一个桶(哈希),然后对桶内的数进行统计答案。
但是出题人要卡你实在简单。它只需要一直询问 [ 1 , 5 × 1 0 4 ] [1 , 5 \times 10^4] [1,5×104] 这个区间,你的复杂度会卡到满。
那你说了,切,我用记忆化记录 [ l , r ] [l,r] [l,r] 的答案好了。
出题人于是把数据改了改:
第 i i i 组询问为 [ i , n ] [i,n] [i,n].
你会发现记忆化不行了。暴力也不行了。数据结构也不行了。似乎凉了?
大力转移
但是你会发现,通过 [ l , r ] → [ l ,