JZOJ 4319. Lucas的数列

JZOJ 4319. Lucas的数列
JZOJ 4319. Lucas的数列

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

算法一:暴力

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

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

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

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

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

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

算法四:可持久化线段树

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

算法五:线段树

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

相关文章:

  • 2021-06-23
  • 2021-07-19
  • 2022-01-17
  • 2022-01-03
  • 2021-12-05
  • 2021-11-26
  • 2021-04-01
  • 2022-01-12
猜你喜欢
  • 2021-11-23
  • 2021-08-25
  • 2021-08-05
  • 2021-08-10
  • 2022-01-23
  • 2021-08-16
  • 2022-01-27
相关资源
相似解决方案