士兵杀敌1(树状数组)
首先,要先讲讲树状数组:
树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值。
1 int lowbit(int x) 2 { 3 4 return x&(-x); 5 6 }
step1: |
令sum = 0,转第二步;
|
step2: |
假如n <= 0,算法结束,返回sum值,否则sum = sum + Cn,转第三步;
|
step3: |
令n = n – lowbit(n),转第二步。
|
1 int Sum(int n) 2 { 3 int sum=0; 4 while(n>0) 5 { 6 sum+=c[n]; 7 n=n-lowbit(n); 8 } 9 return sum; 10 }
step1: |
当i > n时,算法结束,否则转第二步;
|
step2: |
Ci = Ci + x, i = i + lowbit(i)转第一步。
i = i +lowbit(i)这个过程实际上也只是一个把末尾1补为0的过程。
|
1 void change(int i,int x) 2 { 3 while(i<=n) 4 { 5 c[i]=c[i]+x; 6 i=i+lowbit(i); 7 } 8 }
1 #include"stdio.h" 2 #include<string.h> 3 int a[1000000]; 4 int main() 5 { 6 int n,sum; 7 scanf("%d%d",&n,&sum); 8 int i,j,k; 9 memset(a,0,sizeof(a)); 10 for(i=1;i<=n;i++) 11 { 12 int num; 13 scanf("%d",&num); 14 j=i; 15 while(j<=n) 16 { 17 a[j]=a[j]+num; 18 j+=j&(-j); 19 } 20 } 21 for(i=0;i<sum;i++) 22 { 23 scanf("%d%d",&k,&j); 24 int s1=0,s2=0; 25 k=k-1; 26 while(k>=1) 27 { 28 s1=s1+a[k]; 29 k-=k&(-k); 30 } 31 while(j>=1) 32 { 33 s2=s2+a[j]; 34 j-=j&(-j); 35 } 36 printf("%d",s2-s1); 37 putchar(‘\n‘); 38 } 39 return 0; 40 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。