題目鏈結
如果還沒看題目的可以先去看一下題目
前置知識線段樹
這個題目就是兩個操作,乙個是新增資料,乙個是查詢區間最大值,但是由於資料範圍達到1e5,所以我直接想到的就是線段樹了,下面我們來看看線段樹要怎麼做。
首先是建樹,由於題目中的資料有負數,負數,負數,所以大家建樹的時候一定要注意!!!初始化權值和懶人標記為-(1<<62)。
然後是更新,這個就和普通的線段樹更新一樣,需要用到懶人標記的時候就向下更新懶人標記。
最後是查詢,也和模板線段樹一樣,遇到要更新懶人標記的時候及時更新懶人標記就好了。
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define pi acos(-1)
#define pii pair
#define fi first
#define se second
#define mp(a, b) make_pair(a, b)
#define piii pair
#define uf(a, b, i) for (register int i = (a); i <= (b); ++i)
#define df(a, b, i) for (register int i = (a); i >= (b); --i)
using
namespace std;
inline ll read()
while
(ch >=
'0'&& ch <=
'9')
return x * f;
}template
<
class
t>
inline
void
print
(t x)
template
<
class
t>
t max
(t a, t b)
template
<
class
t>
t min
(t a, t b)
const ll mod =
1e9+7;
const ll inf =
-4611686018427387904
;//-(1<<62)
ll ans;
int p;
struct tree tree[
800005];
void
build
(int node,
int l,
int r)
void
down
(int node)
void
update
(int node,
int l,
int r, ll val)
else
}void
ask(
int node,
int l,
int r)
else
}int n, m, t, cnt;
int a[
200005];
void
scan()
void
work()
else}}
intmain()
/*5 100
a -10
q 1a 5
q 1q 2
*/
洛谷 P1198 JSOI2008 最大數
p1198 jsoi2008 最大數現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。2 插入操作。語法 a n 功能 將n加上t,其中t是最近一次查詢操作的答案 如果還未執行過查詢操...
洛谷P1198 JSOI2008 最大數
現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。2 插入操作。語法 a n 功能 將n加上t,其中t是最近一次查詢操作的答案 如果還未執行過查詢操作,則t 0 並將所得結果對乙個固定...
洛谷 P1198 JSOI2008 最大數
序列兩種操作 q l 輸出末尾l個數中的最大值 q 操作用查詢區間最大值即可完成,a 操作需要能夠 add 元素。線段樹明顯可以,理解也比較簡單 這裡採用樹狀陣列維護區間最大值的 板子 來滿足這兩種操作。類封裝的最值 include cstdlib include include include i...