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;
}
posted @ 2026-01-24 16:16  曾翎一  阅读(3)  评论(0)    收藏  举报