#CSP202112B. 序列查询新解
序列查询新解
题目来自第 24 次 CSP 认证 T2,评测使用自造高质量复刻数据。我们承认原始题面与大样例版权均归中国计算机学会(CCF)所有,因此题面与评测服务均免费对外开放。如果您认为我们侵犯了您的权益,可联系我们。
时间限制: 1.0 秒
空间限制: 512 MB
题目背景
上一题“序列查询”中说道: 是一个由 个 范围内整数组成的序列,满足 。基于序列 ,对于 范围内任意的整数 ,查询 定义为:序列 中小于等于 的整数里最大的数的下标。
对于给定的序列 和整数 ,查询 是一个很经典的问题,可以使用二分搜索在 的时间复杂度内轻松解决。但在 IT 部门讨论如何实现这一功能时,小 P 同学提出了些新的想法。
题目描述
小 P 同学认为,如果事先知道了序列 中整数的分布情况,就能直接估计出其中小于等于 的最大整数的大致位置。接着从这一估计位置开始线性查找,锁定 。如果估计得足够准确,线性查找的时间开销可能比二分查找算法更小。
比如说,如果 均匀分布在 的区间,那么就可以估算出:
为了方便计算,小 P 首先定义了比例系数 ,其中 表示下取整,即 等于 除以 的商。进一步地,小 P 用 表示自己估算出的 的大小,这里同样使用了下取整来保证 是一个整数。
显然,对于任意的询问 , 和 越接近则说明小 P 的估计越准确,后续进行线性查找的时间开销也越小。因此,小 P 用两者差的绝对值 来表示处理询问 时的误差。
为了整体评估小 P 同学提出的方法在序列 上的表现,试计算:
$$error(A) = \sum_{i=0}^{N-1}{ | g(i) - f(i) | } = | g(0) - f(0) | + \cdots + | g(N-1) - f(N-1) |$$输入格式
从标准输入读入数据。
输入的第一行包含空格分隔的两个正整数 和 。
输入的第二行包含 个用空格分隔的整数 。
注意 固定为 ,因此输入数据中不包括 。
输出格式
输出到标准输出。
仅输出一个整数,表示 的值。
3 10
2 5 8
5
样例 1 解释
$r = \lfloor \frac{N}{n+1} \rfloor = \lfloor \frac{10}{3+1} \rfloor = 2$
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 2 | 2 | 3 | |||||
| 2 | 3 | 4 | ||||||||
| 0 | 1 | 0 | 1 | |||||||
9 10
1 2 3 4 5 6 7 8 9
0
2 10
1 3
6
样例 3 解释
$r = \lfloor \frac{N}{n+1} \rfloor = \lfloor \frac{10}{2+1} \rfloor = 3$
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 2 | 2 | ||||||
| 0 | 1 | 3 | ||||||||
| 1 | 0 | 1 | ||||||||
子任务
的测试数据满足 且 ;
全部的测试数据满足 且 。
提示
需要注意,输入数据 并不一定均匀分布在 区间,因此总误差 可能很大。