0 分玄关求条
查看原帖
0 分玄关求条
416975
sbno333楼主2024/5/2 02:29

rt,思路对着讲解看了,没看出问题,但是始终只对 44 个点。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int aa[2000009],f[2000009];
int _main(int n){
	if(n==0){
		return 0;
	}
    for(int i=1;i<=n;i++)
        f[i]=0x3f3f3f3f;
    f[1]=aa[1];
    int len=1;
    for(int i=2;i<=n;i++){
        int l,r,mid;
        l=1,r=len;
        if(aa[i]<=f[len])f[++len]=aa[i];
        else{
        while(l<r){   
            mid=(l+r)/2;
            if(f[mid]<=aa[i])r=mid;
            else l=mid+1; 
        }
        f[l]=aa[i];
        }
    }
    return len;
}
int a[2000009];
int b[2000009];
int mp[2000009];
int p;
signed main(){
	int n,m;
	cin>>n>>m;
	int k;
	k=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		k=max(k,a[i]);
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	bool fl;
	fl=1;
	for(int i=1;i<=n;i++){
		if(mp[a[i]]&&mp[a[i]]!=i-1){
			fl=0;
		}else{
			mp[a[i]]=i;
		}
	}
	if(m<k){
		fl=0;
	}
	if(!fl){
		cout<<-1<<endl;
		return 0;
	}
	memset(mp,0,sizeof(mp));
	for(int i=1;i<=n;i++){
		if(!mp[a[i]]){
			mp[a[i]]=++p;
		}
	}
	for(int i=1;i<=m;i++){
		b[i]=mp[b[i]];
	}
	int inn;
	inn=0;
	for(int i=1;i<=m;i++){
		if(b[i]<=i&&b[i]>=i+k-m){
			aa[++inn]=b[i]-i;
		}
	}
	cout<<m-_main(inn)<<endl;
	return 0;
}
2024/5/2 02:29
加载中...