题意:取一段区间,求区间中任取两个数相同的概率;
思路:所求概率P=(A*(A-1)/2+B*(B-1)/2+......)/(R-L+1)*(R-L)/2化简得P=(A*A+B*B+......+Z*Z-(R-L+1))/(R-L+1)*(R-L);
将询问区间左端点放在同一分块中处理,每次处理一个块中的所有询问,对于同一块,询问右端点按严格递增处理,左端点不断移动;
#include#include #include #include using namespace std;int t,n,m,unit;int a[500010],num[500010];struct node{ int id,L,R;}M[500010];int cmp(node a,node b){ if(a.L/unit!=b.L/unit) return a.L/unit M[i].L) { L--; temp-=(long long)num[a[L]]*num[a[L]]; num[a[L]]++;//a[L]的个数加1 temp+=(long long)num[a[L]]*num[a[L]]; } while(R>M[i].R) { temp-=(long long)num[a[R]]*num[a[R]]; num[a[R]]--;//a[L]的个数减1 temp+=(long long)num[a[R]]*num[a[R]]; R--; } while(L