JSOI2008 最大數(線段樹)

2021-10-03 08:50:30 字數 1387 閱讀 3003

現在請求你維護乙個數列,要求提供以下兩種操作:

1、 查詢操作。

語法:q l

功能:查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。

限制:l不超過當前數列的長度。(l > 0)

2、 插入操作。

語法:a n

功能:將n加上t,其中t是最近一次查詢操作的答案(如果還未執行過查詢操作,則t=0),並將所得結果對乙個固定的常數d取模,將所得答案插入到數列的末尾。

限制:n是整數(可能為負數)並且在長整範圍內。

注意:初始時數列是空的,沒有乙個數。

輸入第一行兩個整數,m和d,其中m表示操作的個數(m≤200,000),d如上文中所述,滿足(0接下來的m行,每行乙個字串,描述乙個具體的操作。語法如上文所述。

輸出對於每乙個查詢操作,你應該按照順序依次輸出結果,每個結果佔一行

樣例輸入

5 100

a 96

q 1a 97

q 1q 2

樣例輸出

9693

96提示

最後序列為:96 93

詢問動態區間max,顯然使用線段樹(雖然效率不高)。

有m次詢問,陣列最長為m,則開4*m的線段樹,並且不用建樹。

注意d的值!(long long)

#include

using

namespace std;

#define inf 0x3f3f3f3f

#define full(a,b,c) fill(b,b+sizeof a/4,c)

#define m 2000005

int nown,m;

long

long t,d;

long

long s[

4*m]

;void

update

(int k,

int l,

int r,

int x,

int v)

int mid=

(l+r)

>>1;

if(x<=mid)

update

(k*2

,l,mid,x,v)

;else

update

(k*2+1

,mid+

1,r,x,v)

; s[k]

=max

(s[k*2]

,s[k*2+

1]);

}long

long

ask(

int k,

int l,

int r,

int x,

int y)

intmain()

}

JSOI2008 最大數(線段樹基礎)

現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。l 0 2 插入操作。語法 a n 功能 將 n加上 t 其中 t是最近一次查詢操作的答案 如果還未執行過查詢操作,則 t 0 並將所...

JSOI2008最大數 資料結構

這道題有三個做法呢 第乙個就是普通的線段樹 太懶了不打了 第二個可以單調棧 二分 維護乙個單調遞減的單調棧 每次加入數的時候 把這個數前面小於它的都刪掉 然後查詢的時候二分找到最前面的在所求範圍內的 但是話說這種方法好像被加強的資料卡了?我也不帶了優化了 泥萌自己優化一下看能不能過 不過這種比較新穎...

線段樹 最大數

給定乙個正整數數列 a1,a2,an,每乙個數都在 0 p 1 之間。可以對這列數進行兩種操作 新增操作 向序列後新增乙個數,序列長度變成 n 1 詢問操作 詢問這個序列中最後 l 個數中最大的數是多少。程式執行的最開始,整數序列為空。寫乙個程式,讀入操作的序列,並輸出詢問操作的答案。輸入格式 第一...