ALGORITHM NOTE期望具有线性性,可以将第一次选取的数为为 i 的期望算出来,再把他们相加除以 n 就是答案,问题转化为 对于第一次选取的数 i 的期望长度怎么算,
对于一个 k ,设 f[i] 是以 i 开始的期望长度,我们手模几个样例,发现如果选出来的数 i≥k ,f[i]=1 , 对于 i<k ,f[i]=1+n−i1∑j=i+1nf[j] ,如何理解相当于从 i 开始已经长度为 1 了,我只能选择比 i 大的数,对于 [i+1,n] 每个数我有 n−i1 的概率选中它。因为期望具有线性性,所以求和相加除以平均数+1就是以 i 开始的期望长度,但是这还不足以通过本题,如果每次跑一遍递推就是 n2 的复杂度,发现还可以优化,发现 dp 式子好像是一个后缀和的形式,那么可以维护后缀和 sum ,那么每次的递推不就变成了 f[i]=1+n−i1⋅sum, sum=sum+f[i]=1+n−in−i+1sum,我们要求的 f[1] 已经被包含在最后的 sum 里面,那么就不需要 f 的递推了,只需要维护 sum 即可,sum 发现是一次函数复合.
设 f=ax+b,g=cx+d,(f∘g)(x)=f(g(x))=a(cx+d)+b,写成映射形式就是 (a,b)∘(c,d)↦(ac,ad+b) ,那么我们只要根据这个维护关于sum 一次函数的嵌套即可O(1)求解,需要注意的是维护的嵌套顺序不对,需要求解上面映射的逆映射,这题卡空间,不清楚是否可以通过,不过可以提一嘴逆映射怎么求。
复合类似于于左乘矩阵,求逆也是类似的。具体的,现有一次函数复合 F(x)=f1(f2(f3(x))) ,现在我想得到 f1(x) ,那么我可以 F∘g(x)=f1(f2(f3(g(x)))) , 其中 g(x)=f3−1(f2−1(x))f3−1是f3的逆映射
该题还有一个细节,因为 n 很大,需要线性求逆元