分塊演算法 區間修改 區間最值

2021-09-25 03:22:09 字數 1731 閱讀 8422

給定乙個長度為n數列,現對這個序列有兩種操作:

u l r x:將區間 [l, r] 每個數加x;

q l r:查詢從第l個數到第r個數得最大值和最小值。 所有的數都 <=1000

輸入格式:

第一行給定乙個整數n, m,表示有n個數。m個操作 以下接著一行,n個數。

再接下來m行每行乙個操作。

輸出格式:

對於每個查詢輸出一行最大值和最小值。

in:5 3

1 2 3 4 5

u 1 2 3

u 5 5 -10

q 1 5

out:

5 -5

#include

#define ll long long

using

namespace std;

int a[

200010];

int mx[

2000

], mi[

2000

], add[

2000];

int len, n, m;

pair<

int,

int>

query

(int l,

int r)

}else

for(

int i=bl+

1;i)//中間塊

for(

int i=br*len; i<=r; i++

)//暴力右塊

}return

make_pair

(max, min);}

void

revise

(int l,

int r,

int x)

mi[bl]

=min

(mi[bl]

, a[i]

+add[bl]);

mx[bl]

=max

(mx[bl]

, a[i]

+add[bl]);

}}else

mi[bl]

=min

(mi[bl]

, a[i]

+add[bl]);

mx[bl]

=max

(mx[bl]

, a[i]

+add[bl]);

}for

(int i=bl+

1;i)//中間塊

mi[br]=(

1<<30)

, mx[br]=-

(1<<30)

;for

(int i=br*len; i<

(br+1)

*len; i++

)//暴力右塊

mi[br]

=min

(mi[br]

, a[i]

+add[br]);

mx[br]

=max

(mx[br]

, a[i]

+add[br]);

}}}int

build

(int n)

for(

int i=

0;iintmain()

build

(n);

while

(m--

)else}}

return0;

}

區間修改 區間查詢模板

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數,表示乙個操作,具體如下 操作1 ...

樹狀陣列 區間修改,區間查詢

也許更好的閱讀體驗 好東西,以後可以不打線段樹了 本篇假定讀者都會最基礎的兩種樹狀陣列,即區改單查和單改區查 思考如何維護乙個區間的值,想到了差分 對乙個差分陣列做一次字首和可以得到每個位置的值 再對每個位置累加一下就是乙個區間的值 公式化的講,就是 設差分陣列為 c 則每個位置的值 val i s...

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

題面 首先,我們要推乙個柿子。displaystyle sum a i 把a i 用差分陣列表示出來,就可以寫成 displaystyle sum sum d i 我們考慮一下,每個d i 出現的次數是一定的。那我們可以換一下列舉順序,先列舉d i 在列舉他出現的次數,就可以變成 displayst...