题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1510
一个位置比上面还宽就没用了,而且会收到上面的限制,所以跟上面取 min 即可;
然后维护一个指针,没有可放的位置就无解了。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int const xn=3e5+5; int n,m,r[xn],k[xn]; int rd() { int ret=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();} while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar(); return f?ret:-ret; } int main() { n=rd(); m=rd(); for(int i=1;i<=n;i++) { r[i]=rd(); if(i>1)r[i]=min(r[i],r[i-1]);// } for(int i=1;i<=m;i++)k[i]=rd(); bool fl=0; int p=n; for(int i=1;i<=m;i++) { while(p&&r[p]<k[i])p--; if(!p){fl=1; break;} p--; } if(fl)puts("0"); else printf("%d\n",p+1); return 0; }