截流法進行區間更新,這種演算法在某些特定情況下很簡便,但是其侷限性也很明顯,針對各型別的題目酌情使用,之所以將其挑出來單獨寫一篇是因為其思想沒見過,很是新穎,所以在這裡值得一提。
演算法效能:在進行區間修改和單點修改時的演算法時間複雜度時都是 o(1),但是進行查詢時的時間複雜度是 o(n),對於這種情況,所以一般在進行查詢次數較少的情況下,選擇這種方法才可取。
參考題目:牛客--區間 (interval)
1 #include2 #include3 #include4using
namespace
std;56
const
int maxn=1e6+10;7
intarr[maxn];89
void show(int
n)10
15 printf("\n"
);16}17
18int
main()
1931
show(n);
3233
while(m--)
3440
41for(int i=1;i<=n;++i)
4245 scanf("
%d%d
",&l,&r);
4647
show(n);
4849
for(int i=l;i<=r;++i)
5053 printf("
%lld\n
",ans);
5455
56return0;
57 }
/*in:
10 1
1 2 3 4 5 6 7 8 9 10
2 6 4
1 10
out:
10 1
1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 1 1 1 1
2 6 4
1 5 1 1 1 1 -3 1 1 1
1 10
1 6 7 8 9 10 7 8 9 10
75*/
樹狀陣列 區間更新
樹狀陣列天生用來動態維護陣列字首和,其特點是每次更新乙個元素的值,查詢只能查陣列的字首和,但這個題目求的是某一區間的陣列和,而且要支援批量更新某一區間內元素的值,怎麼辦呢?實際上,還是可以把問題轉化為求陣列的字首和。首先,看更新操作update s,t,d 把區間a s a t 都增加d,我們引入乙...
線段樹區間更新
在此我們之前學習了線段樹的單點更新 點我 但是現在我們遇到乙個這樣的問題 給出乙個n個元素的陣列a1,a2,an。我們總共進行m次操作。每次操作為下列兩種操作其中一種 1 add l,r,v 將a l a l 1 a r 的值全部增加v。2 query l,r 計算子串行a l a l 1 a r ...
gfoj 區間更新模板
題目 如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 input 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m...