1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
之所以会来做这道题,刚好这几天老师给我们讲到了树状数组这一块。
树状数组(Binary
Indexed Tree(BIT), Fenwick Tree):是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值。
|
1
2
3
|
intlowbit(intx){returnx&(x^(x–1));} |
结构可以很快捷的为我们解决一些原本非常棘手的问题。具体代码如下(可结合上图来理解算法):
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
#define N 50001
int k[N],c[N];
int lowbit(int n){
return n&-n;
}
void Add(int i,int n,int j){
while(i<=n){
c[i]+=j;
i+=lowbit(i);
}
}
int sum(int n)
{
int result=0;
while(n!=0){
result+=c[n];
n-=lowbit(n);
}
return result;
}
int main(){
int T,i,a,b,n,f=1;
string s;
scanf("%d",&T);
while(T--){
memset(c,0,sizeof(c));
memset(k,0,sizeof(k));
scanf("%d",&n);
for(i=1;i<=n;i++)
{scanf("%d",&k[i]); Add(i,n,k[i]);}
cout<<"Case "<<f++<<":"<<endl;
while(cin>>s){
if(s== "End") break;
cin>>a>>b;
if(s=="Add")
Add(a,n,b);
if(s=="Sub")
{b=-b;Add(a,n,b);}
if(s=="Query")
{
cout<<sum(b)-sum(a-1)<<endl;}
}
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/t540353563/article/details/48009051