《程式設計珠璣》程式碼之路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++
- 樹狀陣列的區間查詢與區間修改陣列
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- 《程式設計珠璣》程式碼之路14:兩個不會演算法也能把效率提升4倍的小套路程式設計演算法
- Java程式碼實現帶時區時間字串轉為LocalDateTime物件Java字串LDA物件
- 直播小程式原始碼,vue實現時間倒數計時原始碼Vue
- 深度!程式設計師生涯的垃圾時間(上)程式設計師
- node實現檔案屬性批量修改(時間屬性)
- 總是感覺時間不夠用?程式設計師如何管理時間?程式設計師
- Linux設定和修改時間與時區Linux
- 千萬不要相信程式設計師在加班時間寫的程式碼!程式設計師
- Java擷取指定區間內的陣列元素並存入新陣列Java陣列
- 程式碼精進之路-範學雷-極客時間
- linux系統時間程式設計(9) 計算程式片段執行時間clock函式Linux程式設計函式
- 直播系統程式碼,linux date修改系統時間Linux
- 線性表1.0(陣列實現)陣列
- 如何測量程式碼執行時間
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列
- C語言/C++程式設計學習:棧的程式碼實現之陣列方案C語言C++程式設計陣列
- 《程式碼大全》程式設計師們怎樣花費自己的時間程式設計師
- 可程式設計作息時間控制器設計程式設計
- 實現零程式碼開發還需要多長時間
- ubuntu 修改時區或時間 及網路同步時間Ubuntu
- 芻議線段樹 2 (區間修改,區間查詢)
- 小程式年月日時間段區間選擇
- linux系統時間程式設計(8) UTC秒數轉本地字串時間Linux程式設計字串
- 幽默:程式設計是10%時間用於寫程式碼而90%時間用於理解為什麼不工作 -mariofusco程式設計
- 網路程式設計實戰-盛延敏-極客時間-返現優惠程式設計
- 如何修改Fiori Launchpad裡Tile計數呼叫的時間間隔
- Ubuntu、CentOS修改時區、設定24小時時間格式教程。UbuntuCentOS
- HDU1166 敵兵佈陣【樹狀陣列 單點修改+區間查詢】陣列
- JavaScript 計算程式碼執行花費時間JavaScript
- C++日期和時間程式設計總結C++程式設計
- sqlalchemy實現時間列自動更新SQL
- 程式設計師如何預估自己的專案開發時間?程式設計師
- 程式設計師修神之路--問世間非同步為何物?程式設計師非同步