思路
莫队算法
莫队算法是一种解决一系列无修改的区间查询问题的算法。对于区间查询问题,我们通常使用线段树。但是考虑这样一个问题:对[l,r]区间内的计算至少重复三次数的个数。这样的问题如果使用线段树需要在节点上维护区间内数字的个数,而这样维护显然并不能在O(1)完成,因而我们常常使用莫队算法。莫队算法的使用条件是我们可以O(1)时间内通过已知的[l,r]答案得到[l-1,r],[l+1,r],[l,r+1],[l,r-1]的答案,并且我们能够离线询问。通过对询问排序,我们利用O(1)的转移能够以一个较为满意的复杂度解决这个问题(避免重复扫描数列)。这个问题可以使用曼哈顿距离最小生成树来写,但这样写代码似乎太麻烦了些,所以我们使用分块。我们以询问左端点所在的分块的序号为第一关键字,右端点的大小为第二关键字。
莫队算法时间复杂度
分块相同时,右端点递增是O(N)的,分块共有O(sqrt(N)) )个,复杂度为O(N^(1.5))
分块转移时,右端点最多变化N,分块共有O(sqrt(N) )个,复杂度为O(N^(1.5)
分块相同时,左端点最多变化sqrt(N) ,分块转移时,左端点最多变化2sqrt(N) ,共有N个询问,复杂度为O(N^(1.5) )
所有总时间复杂度就是O(N^1.5)
参考
本题思路
莫队模板题。令当前可选的袜子为ans
ans=(color[i]*(color[i]-1)/2);
化简得到ans=(Σ(sum(color[i])2)−(R−L+1))/((R−L+1)∗(R−L))
所以更新为ans=ans-ci^2+(ci+1)^2
代码
1 |
|