P1198 最大數 線段樹水題

2022-04-30 13:42:08 字數 1059 閱讀 5916

這道題模擬一下可以過,但是我們發現線段樹也可以安全水過......

寫的線段樹只需要滋磁單點修改,區間求max即可

我一開始犯了乙個很sb的錯誤:每次插入修改了t,然後瘋狂爆0到懷疑人生...

而且我寫的線段樹還不明不白的碾了胡雨菲幾年前寫的。

1 #include 2 #include 3 #include 4

using

namespace

std;

5const

int n = 200010

;6 typedef long

long

ll;7

ll mo;

8 ll max[n<<2];9

10void build(int l,int r,int

o)11

17int mid=(l+r)>>1

;18 build(l,mid,o<<1

);19 build(mid+1,r,o<<1|1

);20

return;21

}2223void add(int x,int v,int l,int r,int

o)24

32int mid=(l+r)>>1;33

if(x<=mid)add(x,v,l,mid,o<<1

);34

else add(x,v,mid+1,r,o<<1|1

);35 max[o]=max(max[o<<1],max[o<<1|1

]);36

return;37

}3839 ll ask(int l,int r,int l,int r,int

o)40

4647

intmain()

4858 t=ask(top-x,top-1,1,m,1

);59 printf("

%lld\n

",t);60}

61else

6267}68

return0;

69 }

ac**:

洛谷 P1198 最大數 線段樹

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

洛谷 P1198 最大數

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

洛谷 P1198 最大數

首先這是一道線段樹裸題,但是線段樹長度不確定,那麼我們可以在建樹的時候,將每乙個節點初始化為 inf,每次往隊尾加乙個元素即一次單節點更新,注意本題的資料範圍,其實並不用開 long long,具體請看注釋。include include include include define lson l,...