JZOJ 4319. Lucas的数列


看到这道题,因为需要支持区间查询,所以……
算法一:暴力
具体过程不细讲。
期望得分:30分。
算法二:莫队(不会的跳过吧)
针对题目给的公式:
p=m∑i=1mxi
和
s=[i=1∑m(xi−p)2]×m
我们可以将其展开,得到:
s=[i=1∑mxi2−2i=1∑mxi×p+m×p2]×m
设a=i=1∑mxi2,b=i=1∑mxi
则p=mb,s=(a−2×b×mb+mb2)×m=a×m−b2
这里一定要注意,一定要推到最后,不然小数运算容易被卡精度。
如果直接用树状数组来进行莫队的操作的话,时间复杂度是O(nnlogn),只能拿60分,但是如果用值域分块来做的话可以拿80分,具体过程不细讲。
算法三:树套树(区间线段树套权值线段树)
根据算法二推出的式子,我们可以用树套树来维护a,b,m,具体方法请自行思考。但只能拿90分。
算法四:可持久化线段树
我们可以把所有wi离散化,由题意知:最多有31623个不同的wi,我们可以开一个权值线段树,将每一个元素按先后顺序一次插入,然后每次查询用第y个版本的,再减去第x−1个版本的即可。
算法五:线段树
先把所有的元素按wi从小到大排序,然后再把所有的询问按z从小到大排序,然后开一个区间线段树,对于每一次查询的x,y,z,将所有满足wi≤zi的元素插入即可。