题解:CF2106D Flower Boy
Amiyawasdonkey · · 题解
题目翻译
题目传送门(vjudge)
给定一个长度为
要在
求
思路
因为是要从左到右选取数字,所以我们可以贪心地选取数字,即从左往右遍历,只要当前数字大于等于
但是仅仅有从左到右得到的
因此,只要满足:
就说明
Code:
#include<bits/stdc++.h>
#define Iseri namespace
#define Nina std
#define Kawaragi int
#define Momoka main
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define ll long long
#define ull unsigned long long
#define endl "\n"
const int maxn=200005;
using Iseri Nina;
inline ll read(){//快读
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
//===========================================================
ll t,n,m,pre[maxn],erp[maxn],a[maxn],b[maxn],cnt;
Kawaragi Momoka(){
t=read();
while(t--){
n=read(),m=read();
for(ll i=1;i<=n;i++)a[i]=read();
for(ll i=1;i<=m;i++)b[i]=read();
//多测不清空,爆零两行泪TAT
memset(pre,0,sizeof(pre));
memset(erp,0,sizeof(erp));
cnt=0;
for(ll i=1;i<=n;i++){//求“前缀”
if(a[i]>=b[cnt+1]&&cnt<m)cnt++;
pre[i]=cnt;
}
cnt=0;
for(ll i=n;i>=1;i--){//求“后缀”
if(a[i]>=b[m-cnt]&&cnt<m)cnt++;
erp[i]=cnt;
}
if(pre[n]>=m)printf("0\n");//如果最后一位能够最多选到m个数,那就不用插入啦!直接输出0
else{
ll ans=1145141919;//设极大值
for(ll i=0;i<=n;i++){
if(pre[i]+erp[i+1]==m-1)ans=min(ans,b[pre[i]+1]);
}
if(ans==1145141919)printf("-1\n");//如果遍历一遍都找不到,那就没办法了TAT,输出-1
else printf("%lld\n",ans);
}
}
return 0;
}
灵感来源:vjudge
提交记录:这里(vjudge)