C語言樹狀數(shù)組的實例詳解
C語言樹狀數(shù)組的實例詳解
最近學了樹狀數(shù)組,給我的感覺就是 這個數(shù)據(jù)結(jié)構(gòu)好神奇啊^_^
首先她的常數(shù)比線段樹小,其次她的實現(xiàn)復雜度也遠低于線段樹 (并沒有黑線段樹的意思=-=)
所以熟練掌握她是非常有必要的。。
關于樹狀數(shù)組的基礎知識與原理網(wǎng)上一搜一大堆,我就不贅述了,就談一些樹狀數(shù)組的應用好了
1,單點修改,求區(qū)間和
#define lowbit(x) (x&-x) // 設 x 的末尾零的個數(shù)為 y , 則 lowbit(x) == 2^y void Update(int i,int v) // 初始化與單點修改 { while(i <= n) { c[i] += v ; i += lowbit(i) ; } } inline int Sum(int i) // 區(qū)間求和 { int res = 0 ; while(i > 0) { res += c[i] ; i -= lowbit(i) ; } return res ; }
2,區(qū)間修改,單點查詢
這里要用到差分的思想
創(chuàng)建一個差分數(shù)組c[],令c[i] = a[i] - a[i-1] (a[i] 表示原本的第i個數(shù))
則a[i] = ( a[i] - a[i-1] ) + ( a[i-1] - a[i-2] ) + ...... + ( a[2] - a[1] ) +a[1]
= c[i] + c[i-1] + ...... + c[2] + c[1]
所以單點查詢變成了區(qū)間求和
那么區(qū)間修改怎么辦呢 ?
我們看這樣一個例子:
a 1 3 4 5 7 10
c 1 2 1 1 2 3
若我們令區(qū)間[2,4]加2,則
a 1 5 6 7 9 10
c 1 4 1 1 2 1
我們可以發(fā)現(xiàn)只有c[2]和c[5]的數(shù)值改變了,其實原理也很好想,區(qū)間內(nèi)的前后元素差是不變的,只有(區(qū)間第一個元素與前一個元素的差) 和 (區(qū)間后第一個元素與區(qū)間末尾元素的差) 改變了。所以區(qū)間修改問題變成了單點修改問題。
for(int i=1;i<=n;i++) { a[i] = read() ; Update(i,a[i]-a[i-1]); } /* int x=0,y=0; // 注釋掉的內(nèi)容是空間上的優(yōu)化(初學者建議先跳過) for(int i=1;i<=n;i++) { if(i%2) { x = read() ; Update(i,x-y); } else { y = read() ; Update(i,y-x) ; } } */ int ii ; int k,x,y; for(int i=1;i<=m;i++) { ii = read() ; if(ii == 1) { x = read() ; y = read() ; k = read() ; Update(x,k); Update(y+1,-k); } if(ii == 2) { x = read() ; printf("%d\n",Sum(x)); } }
(洛谷有對應的模板題 P3374 與 P3368)
上述就是樹狀數(shù)組最基礎的兩個應用,日后更深入的學習后再來更新。
如有疑問請留言或到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
上一篇:C++ 中私有繼承的作用
欄 目:C語言
下一篇:Unity編輯器下重啟的方法
本文標題:C語言樹狀數(shù)組的實例詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1105.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改