原來聽到樹狀陣列這名字感覺很難,很高大上。學了一下發現不難。而且很好。
普通的陣列修改某個值耗費為o(1),輸出和為o(n);而樹狀陣列為o(logn);
lowbit(x)
返回的是x二進位制最後一位1的位置;
有公式:cn=a(n-a^k+1)+.........+an(其中 k 為 n 的二進位制表示中從右往左數的 0 的個數)。
模版
1 #include2 #includeview code3int a[1000
],n;
4int lowbit(intx)5
8void update(int i,int
val)915
}16int sum(int
i)17
24return
sum;25}
26int
main()
2737
for(i=1;i<=n;i++)
38 printf("
%d "
,a[i]);
39 printf("\n"
);40
int ans=sum(3
);41 printf("
%d\n
",ans);
42//
update(1,3);
43//
ans=sum(3);
44//
printf("%d\n",ans);45}
46 }
hdu1166入門
1view code//hdu1166入門
2 #include3 #include
4int c[50005],n,a[50005];5
char s[100];6
int lowbit(intx)7
10void add(int i,int
val)
1118}19
void sub(int i,int
val)
2027}28
int sum(int
i)29
36return
sum;37}
38int
main()
3952 printf("
case %d:\n
",++ff);
53while(1)54
62else
if(s[0]=='q'
)6370else
if(s[0]=='s'
)7176else
if(s[0]=='e'
)7780}
81}82 }
樹狀陣列模版
1.一維樹狀陣列 獲得2 k public static int lowbit int i 修改結點 public static void add int i,int value 求和 public static int getsum int i return sum 2.二維樹狀陣列 public...
樹狀陣列模版
單點更新,區間求和 include include using namespace std const intmaxn 1e6 1 inta maxn c maxn intmaxnum 1e6 intlowbit intx intsum intx return res void add intx,i...
樹狀陣列模版
分析一下上面那個圖看能得出什麼規律 據圖可知 c1 a1,c2 a1 a2,c3 a3,c4 a1 a2 a3 a4,c5 a5,c6 a5 a6,c7 a7,c8 a1 a2 a3 a4 a5 a6 a7 a8,c9 a9,c10 a9 a10,c11 a11.c16 a1 a2 a3 a4 a5...