線段樹是幹什麼的?有一列數,每次可以進行以下三種操作中的一種:(1) 給指定區間中的每個數都加上某個值;(2) 將指定區間內的所有數置成某乙個統一的值;(3) 詢問乙個區間上的最小值、最大值、所有數的和。樸素做法怎麼做?用線性表儲存,每種操作,對待處理或待詢問區間中的每個元素都逐一進行處理。複雜度多少?假設這個數列的長度為n,總的運算元為m,則這個演算法每次維護的時間複雜度為o(n),整體的時間複雜度為o(mn)為什麼慢?所有的維護都是針對元素的,而題目中所有的維護要求卻都是針對區間的。
pushdown(rt,m-l+1,r-m);//下推標記
//這裡判斷左右子樹跟[l,r]有無交集,有交集才遞迴
if(l <= m) update(l,r,c,l,m,rt<<1);
if(r > m) update(l,r,c,m+1,r,rt<<1|1);
pushup(rt);//更新本節點資訊
}ll query(int l,int r,int l,int r,int rt)
int m=(l+r)>>1;
//下推標記,否則sum可能不正確
pushdown(rt,m-l+1,r-m);
//累計答案
ll ans=0;
if(l <= m) ans+=query(l,r,l,m,rt<<1);
if(r > m) ans+=query(l,r,m+1,r,rt<<1|1);
return ans;
} 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 本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個...
HDU 1166 ,線段樹模板,單點更新,區間總和
第一次做線段樹,帆哥的一句話,我記下來了,其實,線段樹就是一種處理資料查詢和更新的手段。然後,我的 風格,是網上的大牛們的辛苦總結,我就套用了。這裡,我還是簡單說一下線段樹,說的不好,主要方便自己複習。線段樹,3個步驟,建樹,查詢,更新,建樹 到底部就是a陣列的值,建立左右子樹後,向上推根,根為左右...