SPOJ GSS3 單點修改 區間最大子段和

2022-09-20 21:48:11 字數 1038 閱讀 8009

給定乙個序列,需要支援單修和區間最大子段和,\(n \leq 50000\)。

乙個序列的最大欄位和可能出現在左半側最大子段和,右半側最大子段和和跨越兩邊的最大子段和。

維護四個標記:mxsum,mxpre,mxsuf,sum,線段樹操作即可。

有乙個細節,查詢的時候不能直接用左右孩子的最大字尾/字首,因為查詢的區間可能小於最大子段和出現的區間。

兩種解決辦法:

#include using namespace std;

const int n = 5e4 + 10;

struct node ;

int a[n];

struct segment_tree

void build(int l,int r,int rt)

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

int ch = rt << 1;

build(l,mid,ch);

build(mid + 1,r,ch + 1);

update(rt);

} void modify(int rt,int pos,int v)

int mid = (t[rt].l + t[rt].r) >> 1;

int ch = rt << 1;

if(pos <= mid)

else

update(rt);

} node query (int l,int r,int rt)

int mid = (t[rt].l + t[rt].r) >> 1;

int ch = rt << 1;

if(r <= mid)

else if(l > mid) else

}} st;

int n,q;

int main ()

st.build(1,n,1);

cin >> q;

while(q --)

else

} return 0;

}

單點修改 區間求和

如題,已知乙個數列,你需要進行下面兩種操作 第一行包含兩個正整數 n,mn,m,分別表示該數列數字的個數和操作的總個數。第二行包含 nn 個用空格分隔的整數,其中第 ii 個數字表示數列第 ii 項的初始值。接下來 mm 行每行包含 33 個整數,表示乙個操作,具體如下 輸出包含若干行整數,即為所有...

樹狀陣列 單點修改區間查詢

樹狀陣列,時間複雜度o mlogn 明顯優於暴力列舉以及字首和,主要用於單點修改區間查詢 當然還有區間修改單點查詢 如果一道題中只有區間查詢,那麼建議使用字首和維護 思想直接理解不好理解,借助資料 a陣列下標12 3456 78數值2 5632 714以上是我們要儲存的a陣列,就是原資料 b陣列下標...

樹狀陣列(單點修改區間查詢)

lowbit是用來取出二進位制中最低位數的1所代表的二進位制的值。只需要記下 就行了 int lowbit int x 將乙個樹的最子節點修改,則其父節點也需要更改,父父節點也需要修改。x x lowbit x 就是用來取出其父節點的。void add int x,int k 能查詢原陣列的字首和,...