[POI2006]KRA-The Disks

題目鏈接:[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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章