Make It Increasing CF 1473 E

标签:不可   等于   模板   序列   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;
}

Make It Increasing CF 1473 E

标签:不可   等于   模板   序列   scan   can   its   code   ace   

原文地址:https://www.cnblogs.com/League-of-cryer/p/13899373.html

版权声明:完美者 发表于 2020-10-30 12:51:14。
转载请注明:Make It Increasing CF 1473 E | 完美导航

暂无评论

暂无评论...