原题过长,放一下题目大意
题目大意
给你 m m m 个 1 1 1 到 n n n 之间的整数,你要找到若干个大小为固定的 k k k 的闭区间,使得所有这些数都在你找到的某个区间内。你需要最小化这些区间的并集的大小,并输出此大小。本题里区间/区间并集的大小,被定义为,这个区间/区间并集里整数的个数
样例
样例输入1
10 3
5
4
5
8
7
6
样例输出1
5
样例解释:
取
{
4
,
5
,
6
,
7
,
8
}
\{4,5,6,7,8\}
{4,5,6,7,8}
共需要 5 个字节
样例输入2
15 4
6
6
14
11
3
8
5
样例输出2
10
数据范围
100 % n ≤ 1 0 9 , m ≤ 3 ∗ 1 0 5 100\%~~n \leq 10^9,m\leq 3*10^5 100% n≤109,m≤3∗105
闲话
这题不知从哪里得来的,只知道至少有强蓝弱紫甚至中紫的难度。
在得到后,我立刻做出了正确的分析,却因为一种特殊的情况而未能想出正确的状态转移方程,最终没有做出
至于部分分,在原题数据范围中有,但我没有给出,我会在下面的题解部分给出详细介绍
题解
这是一道典型的思路难题,代码20行以内,所以就不贴代码了。
15pts n ≤ 20 , m ≤ 10 n\leq 20,m\leq 10 n≤20,m≤10
这个好拿,但我没去拿,暴力枚举即可
验证部分,可以发现,由于这些长度为
k
k
k的区间可以重叠,重叠的部分对答案没有影响,所以,对于任何一个长度大于
k
k
k的连续段都是可以拼出的
70pts n ≤ 1 0 9 , m ≤ 5000 n\leq 10^9,m\leq 5000 n≤109,m≤5000
其实中间还有30pts与50pts,但不如70pts好拿。
观察可以发现,
n
n
n已然几乎没用,所以只考虑
m
m
m,可以发现数据允许
O
(
m
2
)
O(m^2)
O(m2)通过
考虑
d
p
dp
dp,发现存在以下两种情况
对于第一种情况,较好考虑,状态转移方程为
d
p
[
i
]
=
m
i
n
i
≥
j
{
d
p
[
j
−
1
]
+
(
a
[
j
]
−
a
[
i
]
)
+
1
}
dp[i]=min_{i\geq j}\{dp[j-1]+(a[j]-a[i])+1\}
dp[i]=mini≥j{dp[j−1]+(a[j]−a[i])+1}
对于第二种情况,我们固然希望该区间段长度最短,为
k
k
k,且覆盖点最多,就是距离
i
i
i最远
j
j
j的满足
a
[
i
]
−
a
[
j
]
+
1
<
k
a[i]-a[j]+1<k
a[i]−a[j]+1<k且
i
≥
j
i\geq j
i≥j
于是就可以暴力枚举
100pts
这就简单了,因为 a i a_i ai递增,并且不存在距离最大值,尺取即可。