I Hate It(線段樹維護區間最大值)

2021-10-03 02:30:26 字數 1751 閱讀 5194

題意:給定乙個原始陣列,有2種操作,第一種操作是單點修改id為a的學生的成績改為b,第二種操作是詢問區間a到b中分值最大的一位。

思路

用線段樹維護區間最大值,每次修改之後不斷向上更新區間最大值即可。

**

#include

using

namespace std;

typedef

long

long ll;

const

int n=

2e5+5;

const

int mod=

1e9+7;

const

int inf=

0x7fffffff

;const ll llinf=

0x7fffffffffffffff

;const

double eps=

1e-10

;#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define pb push_back

#define pii pair

#define pll pair

#define debug cout<<"debug"int a[n]

;struct tree

t[n<<2]

;void

build

(int p,

int x,

int y)

int mid=x+y>>1;

build

(p<<

1,x,mid)

;build

(p<<1|

1,mid+

1,y)

; t[p]

.pre=

max(t[p<<1]

.pre,t[p<<1|

1].pre);}

void

change

(int p,

int x,

int y,

int z)

int mid=t[p]

.l+t[p]

.r>>1;

if(x<=mid)

change

(p<<

1,x,y,z);if

(y>mid)

change

(p<<1|

1,x,y,z)

; t[p]

.pre=

max(t[p<<1]

.pre,t[p<<1|

1].pre);}

intask

(int p,

int x,

int y)

int mid=t[p]

.l+t[p]

.r>>1;

if(x<=mid)

ans=

max(ans,

ask(p<<

1,x,y));

if(y>mid)

ans=

max(ans,

ask(p<<1|

1,x,y));

return ans;

}signed

main()

build(1

,1,n);

while

(m--)if

(ch==

'q')}}

}

滑動視窗(poj,線段樹維護區間最值)

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...

線段樹維護區間01

g.小 w 開關燈 problem 4467 discussion description 晚上到家小 w 通過開關燈來保持自己神經的興奮以便清醒地理筆記。n n 2 n 100,000 2 n 100,000 盞燈被連續的編號為 1 n 1 n 剛回到家的時候,所有的燈都是關閉的。小w 通過 n ...

維護序列(線段樹維護區間乘 區間加)

給定乙個長度為n的原序列和模數mod,m個操作,a,b 區間乘c,a,b 區間加c,統計 a,b 的區間和。思路 線段樹維護的還是區間和,但是這裡我們需要用到兩個懶標記,乙個記錄加法,乙個記錄乘法,乘法懶標記下傳之後要重置為1而不是0。對於乙個乘法操作,他影響的是區間和還有這個區間的加法標記 乘法標...