模板組成
模板構成
lowbit (x)//返回
x的最低位1
eg:2^0 2^1 2^2
updata(int x,int val)//更新資料
while(x<=n)//更新的時候我們要更新包含
a[x]
的所有c[x];
//查詢父節點的時候我們就需要
lowbit()
c[x]+=val;
x+=lowbit(x);
如果我們在a[6]陣列加
val
我們需要更新c[6]
lowbit(6)
=2 繼續更新c[6+lowbit[6]]+=val;
6+lowbit[6]=8;
lowbit[8]=8;
繼續更新c[8+8]+=val;
getsum(
int n)//
求和運算
int sum=0;
while(n>0)
{sum+=c[n];
n-=lowbit[n];
這裡的求和資料和上乙個更新資料相反
這裡是不斷
往下尋找
sum[9]=c[9]+c[9-lowbit[9]](
c[8]
)+(c[0]
因為0
不滿足條件就跳出)
因為lowbit(9)=2^0-=1
lowbit(8)=2^3-=8
主要的思路是這個實際的應用需要通過練習
for example
求逆序數
輸入n然後輸入n個資料
input
1 3 2 5 4
output
分析每個資料具有兩個屬性num(數值
)pos
(位置)
struct data
int num,pos;
輸入for(int i=1;i<=n;i++)
{scanf(「%d」.&a[i].num);
a[i].pos=i;
sort(a,a+n,cmp)//將資料進行排序
num從小到大
//注意數值相同時按照
pos排序
離散一下空間
定義hash【
10003】;
for(int i=1;i<=n;i++)
hash[a[i].pos]=i;
int sum=0;
for(int i=1;i<=n;i++)
updata(hash[i],1);
sum+=hash[i];
print(「%d\n」,sum);
樹狀DP個人總結
樹狀dp就是在樹上的動態規劃,樹狀dp的特殊性 無環,dfs不會重複,具有明顯嚴格的層數關係。大神的好文 大神的好文 什麼時候用樹狀dp?什麼題目滿足動態規劃的要求?子問題最優解也是全域性最優解,滿足無後效性,多階段決策問題。把問題首先分解為若干個子問題,在每乙個子問題做 出決 策,動態規劃就是解決...
樹狀陣列總結
樹狀陣列的基本知識已經被各種大牛和菜鳥講到爛了,我就不多說了,下面給出基本操作的 假定原陣列為a 1.n 樹狀陣列b 1.n 考慮靈活性的需要,使用int a傳陣列。define lowbit x x x int sum int a,int x void update int a,int x,int...
樹狀陣列總結
樹狀陣列是對乙個陣列改變某個元素和求和比較實用的資料結構。兩中操作都是o logn 在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下...