題意:給定乙個原始陣列,有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。對於乙個乘法操作,他影響的是區間和還有這個區間的加法標記 乘法標...