BZOJ 1012 [JSOI2008]最大數maxnumber=聽說是線段樹

題目傳送門:23333


聽說是線段樹標算,但我不知道爲毛寫了一個黑科技。


--------------------------

黑科技

維護一個遞減棧,每次增加元素時,如果棧頂元素小於新增則彈出來保持遞減性。

並且同時存下棧中元素的號碼。

查詢時從棧頂往下找,找到一個在L以內最大的輸出即可。


--------------------------

以下論線段樹標算

開始有n個元素,後來加入m個,於是以【1,n+m】爲總區間建樹。

加入元素變成了單點修改。

查詢結尾變成了區間查詢。

然後就會發現世界是那麼美好!!


附黑科技代碼:


#include <cstdio>
#include <algorithm>
#include <iostream>
#include <windows.h>
#define rep(j,k,l) for (int j=k;j<=l;j++)

using namespace std;
int a[200005],st[200005];

int main(){
	
	int n,m,ans=0,l=0,ll=0;
	scanf("%d%d",&n,&m);
	while (n--){
		
		char ch=getchar();
		while (ch!='A'&&ch!='Q') ch=getchar();
		int k;
		scanf("%d",&k);
		if (ch=='A'){
			
			k=(k+ans)%m;
			ll++;a[ll]=k;
			while (l>0&&k>a[st[l]]) l--;
			l++;st[l]=ll;
			
		}
		else{
			
			int p=l;
			while (p>0&&k>=ll-st[p]+1)p--;
			ans=a[st[p+1]];
			printf("%d\n",ans);
			
		}
		
	}
	return 0;
	
}


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