現在請求你維護乙個數列,要求提供以下兩種操作:
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 個數中最大的數是多少。程式執行的最開始,整數序列為空。寫乙個程式,讀入操作的序列,並輸出詢問操作的答案。輸入格式 第一...