POJ 3468 树状数组
来源:互联网 发布:淘宝售后客服怎么做 编辑:程序博客网 时间:2024/05/22 04:29
题目
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 100000typedef 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]; 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 3468 树状数组
- POJ 3468 树状数组
- poj 3468 树状数组解法
- poj 3468 树状数组解法
- POJ 3468 的树状数组解法
- poj 3468树状数组(模板)
- POJ 3468(树状数组 && 线段树)
- POJ 2352 树状数组
- Poj 树状数组
- poj 1990【树状数组】
- poj 2352 树状数组
- poj 2481 树状数组
- poj 3067 树状数组
- POJ 2481 树状数组
- POJ 3067 树状数组
- POJ 2352 树状数组
- poj 2352(树状数组)
- POJ 2481 树状数组
- POJ 2892 线段树(连续问题)
- 自己实现下载框架(三)
- Java JDBC学习笔记
- 王学岗仿QQ页面滑动
- poj 1419(求最大独立集)
- POJ 3468 树状数组
- NSMutableString可变字符串
- 通过adb连接win7与android
- UVA 1586
- 为什么java读取sqlserver2008中的date数据类型的数据比实际的少2天?
- poj2777 Count Color
- 第一天(2016.01.11)
- hdu5491
- UVA 1585