您的位置:首页 > 其它

POJ 3468 树状数组

2016-02-14 23:37 274 查看

题目

You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.

The second line contains N numbers, the initial values of A1, A2, … , AN. -1000000000 ≤ Ai ≤ 1000000000.

Each of the next Q lines represents an operation.

“C a b c” means adding c to each of Aa, Aa+1, … , Ab. -10000 ≤ c ≤ 10000.

“Q a b” means querying the sum of Aa, Aa+1, … , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

Sample Input

10 5

1 2 3 4 5 6 7 8 9 10

Q 4 4

Q 1 10

Q 2 4

C 3 6 3

Q 2 4

Sample Output

4

55

9

15

题意

给一个数组,可以更改任一个元素的值。问任意一个区间内的元素和

题解

用线段树当然是可以做的。这里用树状数组,树状数组实质上是用二进制的存储方法求前缀和。然后查找和更改都是O(logn)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <string>
#include <set>
#include <cmath>
#include <map>
#include <queue>
#include <sstream>
#include <vector>
#define m0(a) memset(a,0,sizeof(a))
#define mm(a) memset(a,0x3f,sizeof(a))
#define m_1(a) memset(a,-1,sizeof(a))
#define f(i,a,b) for(i = a;i<=b;i++)
#define fi(i,a,b) for(i = a;i>=b;i--)
#define FFR freopen("data.in","r",stdin)
#define FFW freopen("data.out","w",stdout)
#define lowbit(k) ((k)&(-k))

using namespace std;
#define SIZE 100000
typedef long long ll;

ll a[SIZE+10];
ll bit1[SIZE+10];
ll bit2[SIZE+10];

void init(int n){
int i,j;
a[0] = 0;
f(i,1,n)
a[i] += a[i-1];
}

ll bit_sum(ll* bit,int n){
ll sum = 0;
while(n){
sum+=bit
;
n-=lowbit(n);
}
return sum;
}

void bit_add(ll* bit,int n,int x,int k){
while(x<=n){
bit[x]+=k;
x+=lowbit(x);
}
}

int main()
{
ios_base::sync_with_stdio(false); cin.tie(0);
int n,m;
cin>>n>>m;
int i,j;
f(i,1,n) cin>>a[i];

init(n);

char c;
f(i,1,m){
cin>>c;
if(c=='Q'){
int L,R;
cin>>L>>R;
ll ans = a[R]-a[L-1];
ans+=(R+1)*bit_sum(bit1,R)-bit_sum(bit2,R);
ans-=L*bit_sum(bit1,L-1)-bit_sum(bit2,L-1);
cout<<ans<<endl;
}else{
int k,L,R;
cin>>L>>R>>k;
bit_add(bit1,n,L,k);bit_add(bit1,n,R+1,-k);
bit_add(bit2,n,L,k*L);bit_add(bit2,n,R+1,-k*(R+1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj