#CSP202112B. 序列查询新解

    ID: 615 Type: Default 1000ms 512MiB Tried: 13 Accepted: 4 Difficulty: 2 Uploaded By: Tags>CSP其他离散化算法基础前缀和差分

序列查询新解

题目来自第 24 次 CSP 认证 T2,评测使用自造高质量复刻数据。我们承认原始题面与大样例版权均归中国计算机学会(CCF)所有,因此题面与评测服务均免费对外开放。如果您认为我们侵犯了您的权益,可联系我们。

时间限制: 1.0 秒

空间限制: 512 MB

题目背景

上一题“序列查询”中说道: 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(log⁡n)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) 的区间,那么就可以估算出:

f(x)≈(n+1)⋅xNf(x) \approx \frac{(n + 1) \cdot x}{N}

为了方便计算,小 P 首先定义了比例系数 r=⌊Nn+1⌋r = \lfloor \frac{N}{n+1} \rfloor,其中 ⌊ ⌋\lfloor \ \rfloor 表示下取整,即 rr 等于 NN 除以 n+1n+1 的商。进一步地,小 P 用 g(x)=⌊xr⌋g(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 上的表现,试计算:

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

输入格式

从标准输入读入数据。

输入的第一行包含空格分隔的两个正整数 nn 和 NN。

输入的第二行包含 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

样例 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 1 2 2 3
g(i)g(i) 2 3 4
∣g(i)−f(i)∣|g(i)-f(i)| 0 1 0 1
9 10
1 2 3 4 5 6 7 8 9
0
2 10
1 3
6

样例 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 2 2
g(i)g(i) 0 1 3
∣g(i)−f(i)∣|g(i)-f(i)| 1 0 1

子任务

70%70\% 的测试数据满足 1≤n≤2001 \leq n \leq 200 且 n<N≤1000n < N \leq 1000;

全部的测试数据满足 1≤n≤1051 \leq n \leq 10^{5} 且 n<N≤109n < N \leq 10^{9}。

提示

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