CF2106D Flower Boy
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;
}

浙公网安备 33010602011771号