洛谷1198最大數(線段樹)

2021-07-05 10:35:49 字數 1531 閱讀 4610

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

1、 查詢操作。

語法:q l

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

限制:l不超過當前數列的長度。

2、 插入操作。

語法:a n

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

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

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

第一行兩個整數,m和d,其中m表示操作的個數(m <= 200,000),d如上文中所述,滿足(0輸出格式:

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

輸入樣例#1:

5 100

a 96

q 1a 97

q 1q 2

輸出樣例#1:

96

9396

[jsoi2008]

洛谷ac

#include #include #include #include #include #include #include #define ll int

using namespace std;

const int maxn=800005;

const ll inf=(ll)2147483648;

ll _max[maxn],a[maxn],mod,ans=0,x;

int m,p=0,ql,qr;

inline ll get()

inline void update(int node,int l,int r)

}inline ll query(int node,int l,int r)

return mx;

}int main()

else

} return 0;

}

bzojac

#include #include #include #include #include #include #include #define ll long long

using namespace std;

const int maxn=800005;

const ll inf=(ll)2147483648;

ll _max[maxn],a[maxn],mod,ans=0,x;

int m,p=0,ql,qr;

inline ll get()

inline void update(int node,int l,int r)

}inline ll query(int node,int l,int r)

return mx;

}int main()

else

} return 0;

}

思路:裸的線段樹點修改;

注意:佇列的位置和結點的區別。

洛谷1198 最大數 線段樹

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

洛谷 P1198 最大數 線段樹

要問區間最大值,肯定是要用線段樹的,不能用樹狀陣列。因為沒有逆元?但是題目求的是最後一段,可以改成類似字首和啊。不行!插入新元素之後更新的複雜度太高了!所以我們就弄乙個初始元素是負數的最大值線段樹,每次插入就是把末尾的元素 update 查詢就是查詢末尾的區間最大值,這樣每次修改 查詢的複雜度是 o...

洛谷1198 最大數

寫了那麼多xx樹和單調佇列後,不如試試爽翻天的倍 r 增 m 吧 q 對於每乙個點,維護從它為起點向左2 j長度的最大值。查詢的時候從大往小列舉2 j更新最大值就行。等等好像 注釋裡面寫過這些了 不保證 的正確性。反正洛谷的資料水過了。1 include 2 include 3 include 4 ...