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