C語言樹狀數(shù)組的實例詳解
C語言樹狀數(shù)組的實例詳解
最近學了樹狀數(shù)組,給我的感覺就是 這個數(shù)據(jù)結(jié)構(gòu)好神奇啊^_^
首先她的常數(shù)比線段樹小,其次她的實現(xiàn)復(fù)雜度也遠低于線段樹 (并沒有黑線段樹的意思=-=)
所以熟練掌握她是非常有必要的。。
關(guān)于樹狀數(shù)組的基礎(chǔ)知識與原理網(wǎng)上一搜一大堆,我就不贅述了,就談一些樹狀數(shù)組的應(yīng)用好了
1,單點修改,求區(qū)間和
#define lowbit(x) (x&-x) // 設(shè) 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));
}
}
(洛谷有對應(yīng)的模板題 P3374 與 P3368)
上述就是樹狀數(shù)組最基礎(chǔ)的兩個應(yīng)用,日后更深入的學習后再來更新。
如有疑問請留言或到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
詳解C++設(shè)計模式編程中責任鏈模式的應(yīng)用
這篇文章主要介紹了C++設(shè)計模式編程中責任鏈模式的應(yīng)用,責任鏈模式使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系,需要的朋友可以參考下2016-03-03
vscode+platformIO開發(fā)stm32f4的實現(xiàn)
這篇文章主要介紹了vscode+platformIO開發(fā)stm32f4的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05
c++ STL容器總結(jié)之:vertor與list的應(yīng)用
本篇文章對c++中STL容器中的vertor與list的應(yīng)用進行了詳細的分析解釋。需要的朋友參考下2013-05-05
C語言 數(shù)據(jù)結(jié)構(gòu)中求解迷宮問題實現(xiàn)方法
這篇文章主要介紹了C語言 數(shù)據(jù)結(jié)構(gòu)中求解迷宮問題實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-03-03

