01 故事起源有N個數排列成一排,如何快速進行區間修改與求和呢?










intlowbit(intx){ returnx&-x; } 把上面的對應位置的lowbit都計算出來再觀察,可以發現lowbit的數值正好就是sum[i]統計的元素個數。








voidadd(intindex,intx){ while(index<=?n)?{ ????????sum[index]?+=?x; ????????index?+=?lowbit(index); ????} } ? ?06 區間查詢例如查詢區間[1,5],需要統計sum[5],sum[4]。


intquery(intindex){ intret=0; while(index>0){ ret+=sum[index]; index-=lowbit(index); } returnret; } 如此,就可以輕松搞定單點修改及區間查詢了,但最開始的問題是區間修改,這個又該如何實現呢? 07 區間修改首先得引入一個差分數組d[i],d[i]=a[i]-a[i-1]。








#defineLLlonglong //單個修改 voidadd(LL*sum,LLindex,LLx){ while(index<=?n)?{ ????????sum[index]?+=?x; ????????index?+=?lowbit(index); ????} } //區間修改 voidrange_add(LLleft,LLright,LLx){ right++; add(sum1,left,x); add(sum1,right,-x); add(sum2,left,x*left); add(sum2,right,-x*right); } 08 區間查詢代碼實現:
//單個查詢 LLquery(constLL*sum,LLindex){ LLret=0; while(index>0){ ret+=sum[index]; index-=lowbit(index); } returnret; } //區間查詢 LLrange_query(LLleft,LLright){ left--; LLsumA=(left+1)*query(sum1,left)-query(sum2,left); LLsumB=(right+1)*query(sum1,right)-query(sum2,right); returnsumB-sumA; } 09 總結樹狀數組主要應用于區間操作,相比起線段樹來說,代碼實現簡單太多了,而且效率也很高,非常值得研究掌握。 審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
代碼
+關注
關注
30文章
4896瀏覽量
70569 -
數組
+關注
關注
1文章
420瀏覽量
26504
原文標題:原來樹狀數組可以這么簡單?
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
如何使用閃存來保存 CYBT-343026 中的數組等數據?
您好,我正在嘗試使用 CYBT-343026 構建一塊電路板。
我想將數據存儲在一個簡單的數組中。T
即使斷電,數據也應該保留。我可以使用EEPROM,但由于數據非常簡單,所以我想使用
發表于 06-25 06:33
看完這篇,SPI其實也很簡單嘛(可下載)
首先我們來簡單介紹一下SPI,SPI是串行外設接口(SerialPeripheralInterface)簡單來講就是它一種高速的,全雙工,同步的通信總線被各種總線搞的暈頭轉向的人來說就會問了
發表于 03-26 14:29
?2次下載
字符串與字符數組的區別
在編程語言中,字符串和字符數組是兩種基本的數據結構,它們都用于存儲和處理文本數據。盡管它們在功能上有一定的重疊,但在內部表示、操作方式和使用場景上存在顯著差異。 1. 內部表示 字符串 字符串在
數組的下標為什么可以是負數
最近有同學發來這樣一段代碼,并提出一個問題,數組的下標為什么可以是負數? ? ? #include int main(){ const char *s = "helloworld"; const
數組名之間可以直接賦值嗎
數組之間的賦值能不能直接使用等于號?比如這樣的代碼。 int main(){ int a[5] = {1, 2, 3, 4, 5}; int b[5] = {0}; b = a
指針數組和二維數組有沒有區別
指針數組和二維數組有沒有區別?比如這樣的兩個代碼。 int main(){ char *s1[] = { "hello", "world", "total" }; char s2[][6

labview字符串數組轉化為數值數組
在LabVIEW中,將字符串數組轉換為數值數組是一項常見的任務,尤其是在處理數據采集、信號處理或用戶輸入時。 1. 理解LabVIEW的數據類型 在開始之前,了解LabVIEW中的數據類型是非
用OPA129搭了一個很簡單的正向放大電路,電路不工作的原因?
用OPA129搭了一個很簡單的正向放大電路,正負12V供電,輸入1mV-100mV的直流信號,但是電路不工作,輸出端是10V左右。各位幫分析一下問題所在。謝謝。
發表于 08-21 06:25
面試常考+1:函數指針與指針函數、數組指針與指針數組
在嵌入式開發領域,函數指針、指針函數、數組指針和指針數組是一些非常重要但又容易混淆的概念。理解它們的特性和應用場景,對于提升嵌入式程序的效率和質量至關重要。一、指針函數與函數指針指針函數:定義:指針

評論