POJ - 3468 A Simple Problem with Integers
2016-07-01 16:54
274 查看
1.题面
http://poj.org/problem?id=34682.题意
给定一个数组,将某一段区间的所有数字加上或减少一个值,并要求能够随时查询任意区间的和。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;
}
相关文章推荐
- C语言文件操作实现的记账功能的控制台程序
- 《AngularJs实战》笔记
- HTML 5调用摄像头并进行拍照
- C# TabControl控件,隐藏选项卡
- webapp前端开发软键盘与position:fixed为我们带来的不便
- Android中Socket大文件断点上传
- U-boot主Makefile分析
- Nginx 的启动、停止、平滑重启、信号控制和平滑升级
- Jmeter之Bean shell使用
- ubuntu 添加coretemp 模块
- 如何设置Tomcat的JVM虚拟机内存大
- Ant 单元测试及Jacoco覆盖率报告生成并将报告提交sonarqube
- hdu_4897_Little Devil I(树链剖分)
- hdu_4897_Little Devil I(树链剖分)
- Linux-手动释放缓存(Buffer、Cache)
- java虚拟机之内存区域与内存溢出异常
- SolrCloud 5.2.1 installation and configuration
- java Collections 排序--多条件排序
- float的使用问题和c的一些运算问题
- Windows下python第三方安装包的安装