提交时间:2025-04-04 21:16:30
运行 ID: 37529
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back #define ppc __builtin_popcountll using namespace std; typedef long long ll; typedef unsigned long long ull; typedef unsigned int uint; const int maxn=1e6+10,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,a[maxn],sa[maxn],sb[maxn]; int f[3],g[3],tf[3],tg[3]; bool L,R; int iv[maxn],pre[maxn],nxt[maxn]; int calc(int l,int r){ L=0,R=0; if(pre[l])f[0]=sa[pre[l]-1],g[0]=sb[pre[l]-1];else f[0]=0,g[0]=0,L=1; if(nxt[r]<=n+m)f[2]=sa[n+m]-sa[nxt[r]],g[2]=sb[n+m]-sb[nxt[r]];else f[2]=0,g[2]=0,R=1; f[1]=sa[nxt[r]-1]-sa[pre[l]],g[1]=sb[nxt[r]-1]-sb[pre[l]]; up(i,0,2)tf[i]=f[i],tg[i]=g[i];bool tL=L,tR=R; int ans=0; bool ok=1; if(!L){ int x=(f[0]+1)*2-1;ans+=(f[0]+1)*2; int t=min(g[1],x);g[1]-=t,f[1]+=t,x-=t; int nxt=f[2]; if(t&1)nxt=nxt-(t+1)/2; else nxt=nxt-t/2-1; if(nxt<0)R=1; t=min(g[2],x);g[2]-=t,f[2]+=t;x-=t;f[2]-=f[0]+1; if(x)ok=0; if(!R){ if(g[1])--g[1],++f[1]; else if(g[0])--g[0],++f[0]; else ok=0; } } if(ok&&(!R)){ ans+=(f[2]+1)*2-1; int x=(f[2]+1)*2-2; int t=min(g[1],x);x-=t; t=min(g[0],x);x-=t; if(x)ok=0; } if(!ok)ans=1e9; //cout<<ans<<endl; up(i,0,2)f[i]=tf[i],g[i]=tg[i];L=tL,R=tR; ok=1; int tot=0; if(!R){ int x=(f[2]+1)*2-2;tot+=(f[2]+1)*2-1; int t=min(g[1],x);g[1]-=t,f[1]+=t,x-=t; int nxt=f[0]; if(t&1)nxt=nxt-t/2-1; else nxt=nxt-t/2; if(nxt<0)L=1; t=min(g[0],x);g[0]-=t,f[0]+=t,x-=t;f[0]-=f[2]; if(x)ok=0; } else tot=1; if(ok&&(!L)){ if(g[1])--g[1],++f[1]; else if(g[2])--g[2],++f[2]; else ok=0; tot+=(f[0]+1)*2-1; int x=(f[0]+1)*2-2; int t=min(g[1],x);x-=t; t=min(g[2],x);x-=t; if(x)ok=0; } if(!ok)tot=1e9; //cout<<tot<<endl; ans=min(ans,tot); return ans; } void slv(){ n=read(),m=read(); up(i,1,n)a[i]=read(),iv[a[i]]=i,++sa[a[i]]; up(i,1,m)++sb[read()]; up(i,1,n+m)sa[i]+=sa[i-1],sb[i]+=sb[i-1]; int R=0,res=1e9; vector<int>P={0};up(i,1,n+m)if(iv[i])P.p_b(i); int pos=0;up(i,1,n+m)if(iv[i])pre[i]=pos,pos=i; pos=n+m+1;down(i,n+m,1)if(iv[i])nxt[i]=pos,pos=i; up(i,1,n){ R=max(R,i); while(R+1<=n&&iv[P[R]]<=iv[P[R+1]])R++; res=min(res,calc(P[i],P[R])); } if(res<=n+m)printf("%d\n",res); else printf("-1"); } int main(){ //freopen("1.in","r",stdin),freopen("1.out","w",stdout); //int t=read();while(t--)slv(); slv(); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }