P8087 『JROI-5』Interval题解
更新日志:
- 2022.3.28 发现之前自己通过多写
6 行代码给算法加了个\log ,进行了优化。 - 2022.10.17 图挂了,改地址。
- 2023.11.7 发现这个动图不仅和一般图片同样好理解还不容易回顾和思考,因此换成了静态图。同时补充了一些描述。
题意:
给定两个长度为
定义
求出最小的
解法:
容易看出
既然对于相同的区间长度,
显然,这样的贪心思路正确。接下来我们看怎么求同一个长度下最大的
题目告诉我们,
那我们故意找茬,偏偏就让所有正整数依次出现,这样
但故意找茬是要吃生瓜蛋子的。如果使
我们来用样例解释一下。
那么对于
由于
优化:
从上面可以看出,由于下划线表示的区间是被数字撑大的,所以区间大小不减,最大
同时可以发现,每次区间覆盖的值,也就是当前的
最后一一比较
namespace{
const int lim=4e6+2;
int n,a[lim],f[lim],p[lim],b[lim],L=0x7f7f7f7f,R=0;
void work(){
n=read();
F(i,1,<=n) a[i]=read(),p[a[i]]=i;//记录每个数字的位置,方便后续撑大区间时的处理
F(i,1,<=n) f[i]=read();
b[1]=1;//第一次实际加上了2,而程序只加了1,因此要提前设置
F(i,1,<=n){
L=min(L,p[i]);
R=max(R,p[i]);//撑大区间
++b[R-L+1];//差分加
}
F(i,1,<=n){
b[i]+=b[i-1];
if(f[i]<b[i]){//比较
cout<<i;
return;
}
}
cout<<0;
}
}