JSOI2008 最大數(線段樹基礎)

2022-02-27 07:00:03 字數 1495 閱讀 7122

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

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行,每行乙個字串,描述乙個具體的操作。語法如上文所述。

輸出格式:

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

從這道題的資料範圍來看,他只有200000次操作

從最壞情況來看,數列長最多隻可能200000

所以,這道題就變成了一道簡單的線段樹

我們預設這是一棵已經開好的大小為200000的線段樹

a操作就是單點修改

q操作就是區間查詢

每個節點維護的是當前節點及其子樹的最大值

a操作就是乙個簡單的單點修改,只要記錄上一次修改的位置,+1就是要修改的位置

q操作就是乙個區間查詢,查詢該區間的最大值,只要改變return的東西就好了

//

luogu-judger-enable-o2

#include#include

#define rii register int i

using

namespace

std;

struct

nodex[

800005

];char

cz;long

long

v,ans,m,d,mw;

long

long add(int wz,long

long val,int l,int r,int

bh)

int harf=(l+r)/2

;

if(wz>harf)

else

return

x[bh].maxn;

}long

long ask(int l,int r,int nl,int nr,int

bh)

int half=(nl+nr)/2

;

if(l<=half&&r>half)

else

else

}return

ltt;

}int

main()

else

}}

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 個數中最大的數是多少。程式執行的最開始,整數序列為空。寫乙個程式,讀入操作的序列,並輸出詢問操作的答案。輸入格式 第一...