洛谷 P1198 JSOI2008 最大數

2021-10-24 16:25:59 字數 1900 閱讀 5224

題目鏈結

如果還沒看題目的可以先去看一下題目

前置知識線段樹

這個題目就是兩個操作,乙個是新增資料,乙個是查詢區間最大值,但是由於資料範圍達到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...