P8087 『JROI-5』Interval
Cocoly1990
·
·
题解
官方题解。
B
考虑改写条件,根据整数的离散性,容易写为
f_{r-l+1}\leq \operatorname{Mex}_{l,r}-1
观察到 \operatorname{Mex} 存在单调性。如何理解该单调性呢?假设 \operatorname{Mex}_{l_0,r_0}=x,那么对于任意的 p>l_0-r_0+1,都存在至少一个长度为 p 的区间 \left[l_1,r_1\right] 使得 \operatorname{Mex}_{l_1,r_1}\geq x.
显然这对我们极具启发意义,与其枚举区间长度,不如枚举 \operatorname{Mex},对于每个 \operatorname{Mex}=x,我们都可以求出最短的区间 \left[l_0,r_0\right] 使得 \operatorname{Mex}_{l_0,r_0}-1=f_{r-l+1},那么只要 r_0-l_0+1\leq r-l+1,区间 \left[l,r\right] 就是合法的。
那么如何 \mathcal{O}\left(1\right) 求出 \left[l_0,r_0\right] 呢,容易发现,如果 \operatorname{Mex}_{l_0,r_0} \geq x,那么1\sim x-1 必须在 \left[l_0,r_0\right] 出现,所以,我们用数组记录下每个数出现的位置,做前缀 \max,\min 即可快速求解。
for(int i = 1; i <= n; i ++)
pos[a[i]] = i;
_min[0] = n + 1;
for(int i = 1; i <= n; i ++){
_max[i] = max(_max[i - 1], pos[i]);
_min[i] = min(_min[i - 1], pos[i]);
}
之后就可以快速求解满足 \operatorname{Mex} = i + 1 的最短区间,我们不妨把它设为 g\left[i\right].
for(int i = 1; i <= n; i ++)
g[i] = _max[i] - _min[i] + 1;
然后枚举区间长度判断即可解决。
int ans = 0;
for(int i = 1; i <= n; i ++){
if(f[i] <= n && g[f[i]] <= i){
ans = i;
break;
}
}
综合时间复杂度 \mathcal{O}\left(n\right) 的。
部分分分别是给 \mathcal{O}\left(n^3\right),\mathcal{O}\left(n^2\right),\mathcal{O}\left(n\log n\right) 的。