标签:
看下面这个问题(动态连续和查询):
1 int n; 2 int S[maxn],A[mxan],S1[maxn]; 3 int begin() 4 { 5 memset(S1,0,sizeof(S1)); 6 for(int i=1;i<=n;i++) 7 { 8 S1[i]=S1[i-1]+A[i]; 9 S[i]=S1[i]-S1[i-lowbit(i)]; 10 } 11 }
1 void add(int i,int x) 2 { 3 //若需要其他操作,可以加一句: 4 //A[i]+=x; 5 while(i<=n) 6 { 7 S[i]+=x;i+=lowbit(i); 8 } 9 }
查询前缀和的方法与之类似,只是i+=lowbit(i);改成了i-=lowbit(i);这里不再介绍证明方法,与上面类似。代码如下:
1 int query2(int i) 2 { 3 int sum=0; 4 while(i!=0) 5 { 6 sum+=S[i];i-=lowbit(i); 7 } 8 return sum; 9 } 10 int query(int l,int r) 11 { 12 return query2(r)-query2(l-1); 13 }
标签:
原文地址:http://www.cnblogs.com/y-clever/p/5631028.html