你能回答這些問題嗎 線段樹

2022-07-17 12:00:13 字數 1768 閱讀 9134

題目:

給定長度為n的數列a,以及m條指令,每條指令可能是以下兩種之一:

1、「1 x y」,查詢區間 [x,y] 中的最大連續子段和,即

2、「2 x y」,把 a[x] 改成 y。

對於每個查詢指令,輸出乙個整數表示答案。

輸入格式

第一行兩個整數n,m。

第二行n個整數a[i]。

接下來m行每行3個整數k,x,y,k=1表示查詢(此時如果x>y,請交換x,y),k=2表示修改。

輸出格式

對於每個查詢指令輸出乙個整數表示答案。

每個答案佔一行。

資料範圍n≤

500000,m

≤100000

'>n≤500000,m≤100000

輸入樣例:

5 3

1 2 -3 4 5

1 2 3

2 2 -1

1 3 2

輸出樣例:
2

-1解題報告:

然後再區間[l,r]這個區間的最大子段和就是左區間的最大子段和,右區間的最大子段和,以及左右區間結合在一起中間的最大子段和。

ac**:

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

5const

int maxn=500001;6

ll maxx(ll a,ll b,ll c)710

struct

node

1122 }tree[maxn<<2

];23

24void pushup(int

rt)25

3132

void build(int l,int r,int

rt)33

42int m=tree[rt].mid();

43 build(l,m,rt<<1

);44 build(m+1,r,rt<<1|1

);45

pushup(rt);46}

47void update(int rt,int x,int

y)48

54int m=tree[rt].mid();

55if(x<=m)

56 update(rt<<1

,x,y);

57else

58 update(rt<<1|1

,x,y);

59pushup(rt);60}

6162 node query(int rt,int l,int

r)63

68int m=tree[rt].mid();

69if(m>=r)

7073

else

if(m

7477

else

7888}89

intmain()

90107

else

108113

}114

}115

116/*

1175 3

1181 2 -3 4 5

1191 2 3

1202 2 -1

1211 3 2

122*/

245 你能回答這些問題嗎

解題思路 由於我們想要logn的時間複雜的情況下得到詢問的答案,並且還要進行修改,為了不超時所以想到了使用線段樹去求最大連續子串行和。線段樹本身是用到了分治的思想,那麼如果用線段樹,我們需要用道哪些東西才能得到正確的答案呢?因為是線段樹,所以我們每乙個序列都需要分成2個子序列。那麼如果我們吧乙個序列...

AcWing 245 你能回答這些問題嗎

線段樹單點修改 查詢最大子段和 一邊寫對?只不過忘了改陣列大小沒看到x yx y x y而已 維護區間和w ww,區間最大子段和f ff,從左端點開始的最大子段和lflf lf,從右端點開始的最大子段和rfrf rfw ww照樣維護,f ff取左兒子和右兒子的max maxma x,還要和左兒子的r...

面試,你回答過這些提問嗎?

面試過程中,面試官會向應聘者發問,而應聘者的回答將成為面試官考慮是否接受他的重要依據。對應聘者而言,了解這些問題背後的 貓膩 至關重要。本文對面試中經常出現的一些典型問題進行了整理,並給出相應的回答思路和參 讀者無需過分關注分析的細節,關鍵是要從這些分析中 悟 出面試的規律及回答問題的思維方式,達到...