JZOJ 4319. Lucas的数列

JZOJ 4319. Lucas的数列

在这里插入图片描述
在这里插入图片描述

看到这道题,因为需要支持区间查询,所以……

算法一:暴力

具体过程不细讲。
期望得分:30分。

算法二:莫队(不会的跳过吧)

针对题目给的公式:
p = ∑ i = 1 m x i m p=\frac{\sum_{i=1}^mx_i}{m} p=mi=1mxi

s = [ ∑ i = 1 m ( x i − p ) 2 ] × m s=[\sum_{i=1}^m(x_i-p)^2]\times m s=[i=1m(xip)2]×m
我们可以将其展开,得到:
s = [ ∑ i = 1 m x i 2 − 2 ∑ i = 1 m x i × p + m × p 2 ] × m s=[\sum_{i=1}^mx_i^2-2\sum_{i=1}^mx_i\times p+m\times p^2] \times m s=[i=1mxi22i=1mxi×p+m×p2]×m
a = ∑ i = 1 m x i 2 , b = ∑ i = 1 m x i a=\sum_{i=1}^mx_i^2,b=\sum_{i=1}^mx_i a=i=1mxi2,b=i=1mxi
p = b m , s = ( a − 2 × b × b m + b 2 m ) × m = a × m − b 2 p=\frac{b}{m},s=(a-2\times b\times\frac{b}{m}+\frac{b^2}{m})\times m=a\times m-b^2 p=mb,s=(a2×b×mb+mb2)×m=a×mb2
这里一定要注意,一定要推到最后,不然小数运算容易被卡精度。
如果直接用树状数组来进行莫队的操作的话,时间复杂度是 O ( n n log ⁡ n ) O(n\sqrt n \log n) O(nn logn),只能拿60分,但是如果用值域分块来做的话可以拿80分,具体过程不细讲。

算法三:树套树(区间线段树套权值线段树)

根据算法二推出的式子,我们可以用树套树来维护 a , b , m a,b,m a,b,m,具体方法请自行思考。但只能拿90分。

算法四:可持久化线段树

我们可以把所有 w i w_i wi离散化,由题意知:最多有31623个不同的 w i w_i wi,我们可以开一个权值线段树,将每一个元素按先后顺序一次插入,然后每次查询用第 y y y个版本的,再减去第 x − 1 x-1 x1个版本的即可。

算法五:线段树

先把所有的元素按 w i w_i wi从小到大排序,然后再把所有的询问按 z z z从小到大排序,然后开一个区间线段树,对于每一次查询的 x , y , z x,y,z x,y,z,将所有满足 w i ≤ z i w_i\leq z_i wizi的元素插入即可。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页