您的位置:首页 > 其它

POJ - 3468 A Simple Problem with Integers

2016-07-01 16:54 274 查看

1.题面

http://poj.org/problem?id=3468

2.题意

给定一个数组,将某一段区间的所有数字加上或减少一个值,并要求能够随时查询任意区间的和。

3.思路

使用线段树

4.代码

/*****************************************************************
> File Name: Cpp_Acm.cpp
> Author: Uncle_Sugar
> Mail: uncle_sugar@qq.com
> Created Time: 2016年07月01日 星期五 15时40分30秒
*****************************************************************/
# include <cstdio>
# include <cstring>
# include <cctype>
# include <cmath>
# include <cstdlib>
# include <climits>
# include <iostream>
# include <iomanip>
# include <set>
# include <map>
# include <vector>
# include <stack>
# include <queue>
# include <algorithm>
using namespace std;

const int debug = 1;
const int size = 900000 + 10;
const int INF = INT_MAX>>1;
typedef long long ll;

struct node{
ll sum;
ll adder;
} tree[size];

void Build(int no,int lb,int rb){
if (lb==rb){
cin >> tree[no].sum;
}else {
int mid = (lb + rb)>>1;
Build(no<<1,lb,mid);
Build(no<<1|1,mid+1,rb);
tree[no].sum = tree[no<<1|1].sum + tree[no<<1].sum;
}
}

ll Sum(int a,int b,int no,int lb,int rb){
ll ret = 0;
if (a<=lb&&rb<=b){
ret += tree[no].adder*(rb - lb + 1);
ret += tree[no].sum;
}else {
int mid = lb+rb>>1;
if (a <= mid) ret += Sum(a,b,no<<1,lb,mid);
if (b > mid) ret += Sum(a,b,no<<1|1,mid+1,rb);
ret += tree[no].adder*(min(b,rb) - max(a,lb) + 1);
}
return ret;
}
void Add(int a,int b,int c,int no,int lb,int rb){
if (a<=lb&&rb<=b){
tree[no].adder += c;
}else {
int mid = lb+rb>>1;
if (a <= mid) Add(a,b,c,no<<1,lb,mid);
if (b > mid) Add(a,b,c,no<<1|1,mid+1,rb);
tree[no].sum = tree[no<<1].sum + tree[no<<1|1].sum;
tree[no].sum += tree[no<<1].adder*(mid - lb + 1);
tree[no].sum += tree[no<<1|1].adder*(rb - mid);
}
}

int main()
{
std::ios::sync_with_stdio(false);cin.tie(0);
int i,j;
int n,q;
while (cin >> n >> q){
Build(1,1,n);
char cmd[10];
while (q--){
int a,b,c;
cin >> cmd;
if (cmd[0]=='Q'){
cin >> a >> b;
cout << Sum(a,b,1,1,n) << endl;
}else {
cin >> a >> b >> c;
Add(a,b,c,1,1,n);
}
}
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: