求调,WA on #12
查看原帖
求调,WA on #12
957618
oyoham楼主2024/3/7 15:33
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned ll
inline ll read(){
	ll x=0;
	short f=1;
	char c=getchar();
	while(c>57||c<48){
		if(c==45) f=-1;
		c=getchar();
	}
	while(c<58&&c>47){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}
inline void write(ll x){
	if(x<0ll) putchar(45),x=~x+1;
	if(x>9ll) write(x/10);
	putchar(x%10|48);
}
int n=read(),k=read();
int a[500005];
int dot[500005];
int dp[5000005];
int len;
int LIS(int l,int r){
	len=1;
	dp[len]=a[l];
	for(int i=l+1;i<r;i++){
		if(a[i]>=dp[len]){
			dp[++len]=a[i];
		}
		else{
			int k=upper_bound(dp+1,dp+len+1,a[i])-dp;
			dp[k]=a[i];
		}
	}
	return upper_bound(dp+1,dp+len+1,a[r])-dp;
}
int ans=0;
int main(){
	for(int i=1;i<=n;i++){
		a[i]=read()-i;
	}
	for(int i=1;i<=k;i++){
		dot[i]=read();
	}
	dot[++k]=0;
	dot[++k]=n+1;
	a[0]=-(1<<30);
	a[n+1]=1<<30;
	sort(dot+1,dot+k+1);
	for(int i=1;i<k;i++){
		if(dot[i]==dot[i+1]) continue;
		if(a[dot[i+1]]<a[dot[i]]) return write(-1),0;
		ans+=(dot[i+1]-dot[i]+1)-LIS(dot[i],dot[i+1]);
	}
	write(ans);
}

recording

2024/3/7 15:33
加载中...