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; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- POJ 1200 Crazy Search(简单哈希)
- 【高手回避】poj3268,一道很水的dijkstra算法题