《程式設計珠璣》程式碼之路13:陣列如何線上性時間內實現多次區間修改
給一個陣列,每次對某個區間增加某個值,如何線上性時間內完成。
比如一個陣列,剛開始都是0吧,如下表,第一行是下標:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
操作 1 3 5,代表給下標1-3的元素都加5,有很多次這樣的操作。
正常來說,這個演算法複雜度為n^2。
要實現線性時間,就只能通過某種記錄方式,然後再通過記錄,還原出最後的資料。
我們開闢一個csum陣列,對每一波操作(left, right, value)有:
csum[left -1] -= value;
csum[right] += value;
然後對每一對三元操作都以同樣的方式記錄。
例如1 3 5操作完成後,csum陣列為:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
-5 | 0 | 0 | 5 | 0 | 0 | 0 | 0 |
最後按照如下方式還原:
x[i] = x[i + 1] + csum[i];
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | 5 | 5 | 5 | 0 | 0 | 0 | 0 |
就得到了區間修改後的陣列。
完整程式碼如下:
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<int> nums, csum;
const int NUMS = 10;
const int NINTERVAL = 3;
int main(){
freopen("in.txt", "r", stdin);
int value = 4;
for (int i = 0; i < NUMS + 1; ++i){
nums.push_back(0);
csum.push_back(0);
}
int leftV[NINTERVAL] = {2, 3, 7};
int rightV[NINTERVAL] = {4, 6, 9};
for (int i = 0; i < NINTERVAL; ++i){
if (leftV[i] - 1 >= 0){
csum[leftV[i] - 1] -= value;
}
csum[rightV[i]] += value;
}
for (int i = NUMS - 1; i >= 0; --i){
nums[i] = nums[i + 1] + csum[i];
}
for (int i = 0; i < NUMS; ++i){
cout << nums[i] << endl;
}
return 0;
}
相關文章
- 程式設計珠璣,字字珠璣程式設計
- 《程式設計珠璣》程式碼之路15:節省空間的常見姿勢程式設計
- 《程式設計珠璣》程式碼之路11:最大子陣列和問題,花式七種解法程式設計陣列
- 程式設計珠璣:續(程式設計珠璣.Ⅱ修訂版)程式設計
- 程式設計珠璣程式設計
- 《程式設計珠璣》程式碼之路12:如何用C/C++實現array[-1]並利用它寫出優美的程式碼程式設計C++
- 把《程式設計珠璣》讀薄程式設計
- 《程式設計珠璣》第一章-點陣圖排序程式設計排序
- 《程式設計珠璣》第二章-迴圈移位程式設計
- 《程式設計珠璣》第2章三個問題程式設計
- 樹狀陣列的區間查詢與區間修改陣列
- 《程式設計珠璣》程式碼之路14:兩個不會演算法也能把效率提升4倍的小套路程式設計演算法
- 將時間日期分割成陣列程式碼例項陣列
- 直播小程式原始碼,vue實現時間倒數計時原始碼Vue
- 如何為業餘程式設計擠時間程式設計
- Java程式碼實現帶時區時間字串轉為LocalDateTime物件Java字串LDA物件
- node實現檔案屬性批量修改(時間屬性)
- iOS面試珠璣iOS面試
- 從程式設計師到專案經理(13)如何管理自己的時間(下)程式設計師
- 空間、運動(時間)以及程式設計師程式設計師
- 總是感覺時間不夠用?程式設計師如何管理時間?程式設計師
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- 程式設計師的時間估算程式設計師
- 不要相信程式設計師在加班時間寫的程式碼程式設計師
- 程式設計師一週花多少時間程式設計?程式設計師
- 時間小人程式碼
- Java擷取指定區間內的陣列元素並存入新陣列Java陣列
- 一本書到底有幾個版本?——《程式設計珠璣》和《重構》程式設計
- 程式設計師如何和“美國時間”愉快的玩耍程式設計師
- javascript實現的時間日期格式化程式碼JavaScript
- 程式碼精進之路-範學雷-極客時間
- js計算兩個時間點時間間隔的程式碼例項JS
- Linux設定和修改時間與時區Linux
- 【樹狀陣列 區間更新區間查詢】code陣列
- 如何測量程式碼執行時間
- 程式設計師最多能用多少時間來程式設計?程式設計師
- 千萬不要相信程式設計師在加班時間寫的程式碼!程式設計師
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列