#P16060. [CSPro 24] 序列查询新解

[CSPro 24] 序列查询新解

题目背景

洛谷的测试数据仅供民间交流使用,非官方测试数据。官方评测链接:https://www.cspro.org/

题目描述

上一题“序列查询”中说道:A=[A0,A1,A2,,An]A = [A_0, A_1, A_2, \cdots, A_n] 是一个由 n+1n + 1[0,N)[0, N) 范围内整数组成的序列,满足 0=A0<A1<A2<<An<N0 = A_0 < A_1 < A_2 < \cdots < A_n < N。基于序列 AA,对于 [0,N)[0, N) 范围内任意的整数 xx,查询 f(x)f(x) 定义为:序列 AA小于等于 xx 的整数里最大的数的下标

对于给定的序列 AA 和整数 xx,查询 f(x)f(x) 是一个很经典的问题,可以使用二分搜索在 O(logn)O(\log n) 的时间复杂度内轻松解决。但在 IT 部门讨论如何实现这一功能时,小 P 同学提出了些新的想法。

小 P 同学认为,如果事先知道了序列 AA 中整数的分布情况,就能直接估计出其中小于等于 xx 的最大整数的大致位置。接着从这一估计位置开始线性查找,锁定 f(x)f(x)。如果估计得足够准确,线性查找的时间开销可能比二分查找算法更小。

比如说,如果 A1,A2,,AnA_1, A_2, \cdots, A_n 均匀分布在 (0,N)(0, N) 的区间,那么就可以估算出:

$$\begin{aligned} f(x) \approx \frac{(n + 1) \cdot x}{N} \end{aligned}$$

为了方便计算,小 P 首先定义了比例系数 r=Nn+1r = \lfloor \frac{N}{n+1} \rfloor,其中 \lfloor \rfloor 表示下取整,即 rr 等于 NN 除以 n+1n + 1 的商。进一步地,小 P 用 g(x)=xrg(x) = \lfloor \frac{x}{r} \rfloor 表示自己估算出的 f(x)f(x) 的大小,这里同样使用了下取整来保证 g(x)g(x) 是一个整数。

显然,对于任意的询问 x[0,N)x \in [0, N)g(x)g(x)f(x)f(x) 越接近则说明小 P 的估计越准确,后续进行线性查找的时间开销也越小。因此,小 P 用两者差的绝对值 g(x)f(x)|g(x) - f(x)| 来表示处理询问 xx 时的误差。

为了整体评估小 P 同学提出的方法在序列 AA 上的表现,试计算:

$$\begin{aligned} error(A) = \sum_{i=0}^{N-1} |g(i) - f(i)| = |g(0) - f(0)| + \cdots + |g(N - 1) - f(N - 1)| \end{aligned}$$

输入格式

从标准输入读入数据。

输入的第一行包含空格分隔的两个正整数 nnNN

输入的第二行包含 nn 个用空格分隔的整数 A1,A2,,AnA_1, A_2, \cdots, A_n

注意 A0A_0 固定为 00,因此输入数据中不包括 A0A_0

输出格式

输出到标准输出。

仅输出一个整数,表示 error(A)error(A) 的值。

3 10
2 5 8
5
9 10
1 2 3 4 5 6 7 8 9
0
2 10
1 3
6

提示

样例1解释

A=[0,2,5,8]A = [0, 2, 5, 8]

$r = \lfloor \frac{N}{n+1} \rfloor = \lfloor \frac{10}{3+1} \rfloor = 2$

ii 0 1 2 3 4 5 6 7 8 9
f(i)f(i) 0 1 2 3
g(i)g(i) ^ ^ 2 ^ 3 4
g(i)f(i)|g(i) - f(i)| 0 1 0 1

注:表格中空白单元格表示该行在该列无对应值(或为省略),实际计算时按需填充。根据题意,g(i)g(i)g(i)f(i)|g(i)-f(i)| 应对所有 i=0i=099 有定义,此处按原图结构保留空格,但完整计算应补全:

  • g(0)=0/2=0g(0) = \lfloor 0/2 \rfloor = 0, 00=0|0-0|=0
  • g(1)=1/2=0g(1) = \lfloor 1/2 \rfloor = 0, 00=0|0-0|=0
  • g(2)=2/2=1g(2) = \lfloor 2/2 \rfloor = 1, 11=0|1-1|=0
  • g(3)=3/2=1g(3) = \lfloor 3/2 \rfloor = 1, 11=0|1-1|=0
  • g(4)=4/2=2g(4) = \lfloor 4/2 \rfloor = 2, 21=1|2-1|=1
  • g(5)=5/2=2g(5) = \lfloor 5/2 \rfloor = 2, 22=0|2-2|=0
  • g(6)=6/2=3g(6) = \lfloor 6/2 \rfloor = 3, 32=1|3-2|=1
  • g(7)=7/2=3g(7) = \lfloor 7/2 \rfloor = 3, 32=1|3-2|=1
  • g(8)=8/2=4g(8) = \lfloor 8/2 \rfloor = 4, 43=1|4-3|=1
  • g(9)=9/2=4g(9) = \lfloor 9/2 \rfloor = 4, 43=1|4-3|=1

因此总和为:0+0+0+0+1+0+1+1+1+1=50+0+0+0+1+0+1+1+1+1 = 5

error(A)=5error(A) = 5

样例 3 解释

A=[0,1,3]A = [0, 1, 3]

$r = \lfloor \frac{N}{n+1} \rfloor = \lfloor \frac{10}{2+1} \rfloor = 3$

ii 0 1 2 3 4 5 6 7 8 9
f(i)f(i) 0 1 2 3
g(i)g(i) ^ ^ 2 ^ 3 4
g(i)f(i)|g(i) - f(i)| 0 1 0 1

子任务

70%70\% 的测试数据满足 1n2001 \leq n \leq 200n<N1000n < N \leq 1000

全部的测试数据满足 1n1051 \leq n \leq 10^5n<N109n < N \leq 10^9

提示

需要注意,输入数据 [A1An][A_1 \cdots A_n] 并不一定均匀分布在 (0,N)(0, N) 区间,因此总误差 error(A)error(A) 可能很大。