https://codeforces.com/problemset/problem/2106/D
解题思路:我们不光要求前缀,还要求后缀。我们可以用前后缀分别来维护a[N]大于b[N]的数目,到时候这届如果前缀数不够的话我们就直接拼起来看行不行。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
int T;
int n,m;
int pre[N],erp[N];
int main()
{cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=m;i++){cin>>b[i];}int cnt=0;memset(pre,0,sizeof pre);memset(erp,0,sizeof erp);for(int i=1;i<=n;i++){if(a[i]>=b[cnt+1]&&cnt<m){cnt++;}pre[i]=cnt;}cnt=0;for(int i=n;i>=1;i--){if(a[i]>=b[m-cnt]&&cnt<m)cnt++;erp[i]=cnt;}if(pre[n]>=m) cout<<0<<endl;else{int ans=0x3f3f3f3f;bool flag=false;for(int i=0;i<=n;i++){if(pre[i]+erp[i+1]==m-1){ans=min(ans,b[pre[i]+1]);flag=true; } }if(!flag){cout<<-1<<endl;}else{cout<<ans<<endl;}}}return 0;
}