国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

樹狀數組學習心得

2019-11-06 06:25:30
字體:
來源:轉載
供稿:網友

這里的文章寫得不錯:http://blog.csdn.net/int64ago/article/details/7429868

這里寫圖片描述

從這張圖片可以看出樹狀數組是一個二分的思想。那么它的本質是什么呢?其實是二進制數。例如6如果用二進制數來表示6=0110=4+2 , 13=1101=8+4+1 . 因此我們可以用一個c[]數組來表示管轄范圍,c[13]=c[8]+c[4]+c[1]. 那么求1~13的和就不用a[1]+a[2]+…a[13]了,而是可以直接c[8]+c[4]+c[1]。

我們可以看出剛才的13是1101有8,4,1構成,倒序來寫就是13=1+4+8。我們可以先把1減掉,12=4+8,再把4減掉,8=8,再把8減掉8-8=0.這樣一步一步求和運算。對應的1,4,8就是末尾1對應的位置,也就是大牛博客里講到的Lowbit=x & (-x).這里不贅言。

這里寫圖片描述 那么如何能把a[]數組轉換為c[]數組呢?這里給大家一種構造,就是每個c[i]管轄的范圍就是lowbit(i).比如c[6]的管轄范圍是2,原因是lowbit(6)=0010,保留最后一個1。那么什么樣的子節點對父節點有影響。其實就是它加上它的lowbit.相當于二分(形象的講是鏡像),把它另一邊的數加上就是它的父節點。例如4的管轄范圍為4,相當于二分鏡像的另一邊管轄范圍,加上自己的節點標號就是父節點的值8。再如10的父節點是12.那么10管轄的范圍應該是2,其實也就相當于二分鏡像的另一邊管轄范圍,加上就是父節點的值。

lowbit//-x=取反+1

int lowbit(int x){ return x&(-x);}

構建父節點c[]

void update(int p,int x) { while(p<=n) { c[p]+=x; p+=lowbit(p); } }

區間求和

int sum(int p) { int sum=0; while(p>0) { sum+=c[p]; p-=lowbit(p); } return sum; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 襄樊市| 合川市| 贵港市| 安溪县| 务川| 西昌市| 无锡市| 金乡县| 侯马市| 都昌县| 泸溪县| 澎湖县| 嘉定区| 香格里拉县| 贞丰县| 济源市| 冀州市| 盐城市| 中卫市| 东莞市| 调兵山市| 宣化县| 应用必备| 陕西省| 大埔区| 赞皇县| 河东区| 噶尔县| 道孚县| 普兰县| 清徐县| 通州市| 阿鲁科尔沁旗| 深泽县| 高密市| 嘉峪关市| 尼玛县| 丹棱县| 柯坪县| 呼图壁县| 乐清市|