題目鏈接:[POI2006]KRA-The Disks
顯然如果上一個盤子的位置爲pos,那麼我們就需要從1->pos中找到第一個小於k的位置。
直接線段樹即可,因爲是在前綴中找,所以不用二分。
其實還一個線性解法,先記錄前綴min,然後如果前面有一個值小於k,那麼肯定往前移動。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=3e5+10;
int n,m,mi[N],pos;
signed main(){
cin>>n>>m; pos=n+1; mi[0]=1e9;
for(int i=1;i<=n;i++) scanf("%d",&mi[i]),mi[i]=min(mi[i],mi[i-1]);
for(int i=1,k;i<=m&&pos;i++){
scanf("%d",&k);
while(pos&&mi[pos-1]<k) pos--;
pos--;
}
cout<<max(0,pos);
return 0;
}