题外话:好久没写blog了啊~~
题目大意:给你n条长度为ai的线段,求在其中任选三条出来,能构成三角形的概率。即求在这n条线段中找出三条线段所能拼出的三角形数量/c(n,3)。
假设我们手中有3条长度分别为$x,y,z$的边(为了简化问题我们假设$x<y<z$,$x,y,z$相等的情况另行讨论),如果他们能拼成三角形,必然满足$x+y>z$且$z-y<x$。
该题的$O(n^3)$做法:枚举其中的3条边,套用上面的判断公式,进行累计。
但通过简单的变式,我们假设我们已经确定了$x$和$y$,那么$z$的范围即为$[x,x+y)$,我们维护一个数组$num$,$num_i$表示长度为i的线段数量。再维护一个num的前缀和sum。则$ans=\sum^{n-1}_{x=1} \sum^{n}_{y=x+1} num_x * num_y*(sum[x+y-1]-sum[y])$,运算该和式的时间复杂度为$O(n^2)$