标签:不可 等于 模板 序列 scan can its code ace
魔改一下nlogn求最长不下降子序列的模板就行
对于不能修改的位置 他们肯定是存在答案里面的
那么维护答案序列最后的不可修改位置 设为las
如果新加入的数的位置小于等于las 则跳过
否则 维护las 并且把las以后的序列清空
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int a[N],b[N],l[N],e,ban[N],las;
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
for(int i = 1; i <= k; i++) scanf("%d",&b[i]),ban[b[i]]=1;
for(int i = 2; i <= k; i++){
if(a[b[i]]-a[b[i-1]]<b[i]-b[i-1]){
puts("-1");
return 0;
}
}
for(int i = 1; i <= n; i++) a[i]-=i;
for(int i = 1; i <= n; i++){
if(e==0||a[i]>=l[e]){
l[++e]=a[i];
if(ban[i]) las=e;
}else{
int p = upper_bound(l+1,l+e+1,a[i])-l;
if(p<=las) continue;
l[p]=a[i];
if(ban[i]) las=p,e=p;
}
}
printf("%d\n",n-e);
return 0;
}
标签:不可 等于 模板 序列 scan can its code ace
原文地址:https://www.cnblogs.com/League-of-cryer/p/13899373.html