線段樹 區間更新 區間查詢

2021-10-07 21:14:01 字數 1094 閱讀 7843

題意:

題解:如果採用單點更新的思路對區間進行更新的話時間複雜度會比較高,因此用了乙個lazy陣列(俗稱懶人標記),它為什麼叫懶人標記呢,比如更新的區間為[l,r]+z,而l到r覆蓋了線段樹某乙個節點的區間,那麼可以將該節點對應的lazy陣列的值加上z,同時更新該節點的值,這樣就可以避免更新它子孫節點的值了,當要查詢或者修改的時候要將lazy標記往下傳一層,這樣就能保證當在更新或查詢的時候子孫節點的值是正確的。

**:

#includeusing namespace std;

typedef long long ll;

const int maxn=5e5+10;

ll a[maxn],tree[maxn],lazy[maxn];

int n,m;

void build(int node,int start,int end)

int mid=(start+end)/2;

build(node*2,start,mid);

build(node*2+1,mid+1,end);

tree[node]=tree[node*2]+tree[node*2+1];

}void pushdown(int node,int tot)

void update(int node,int start,int end,int x,int y,ll z)

pushdown(node,end-start+1);

int mid=(start+end)/2;

if(x<=mid) update(node*2,start,mid,x,y,z);

if(y>mid) update(node*2+1,mid+1,end,x,y,z);

tree[node]=tree[node*2]+tree[node*2+1];

}ll query(int node,int start,int end,int l,int r)

int main()

else

} return 0;

}

單點更新,區間查詢線段樹

線段樹的空間複雜度是4n include include include using namespace std const int maxn 100005 const int inf 0x3f3f3f3f int n,a maxn struct node 結點 tree maxn 4 樹結點儲存陣...

I Hate It 線段樹單點更新區間查詢

很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。input 本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個...

線段樹 學習 模板 單點更新 區間更新

線段樹是幹什麼的?有一列數,每次可以進行以下三種操作中的一種 1 給指定區間中的每個數都加上某個值 2 將指定區間內的所有數置成某乙個統一的值 3 詢問乙個區間上的最小值 最大值 所有數的和。樸素做法怎麼做?用線性表儲存,每種操作,對待處理或待詢問區間中的每個元素都逐一進行處理。複雜度多少?假設這個...