【poj 3468】A Simple Problem with Integers 题意&题解&代码(C++)
2016-04-01 16:28
495 查看
题目链接:
http://poj.org/problem?id=3468
题意:
操作,给区间加上某个值或区间修改。
代码:
http://poj.org/problem?id=3468
题意:
操作,给区间加上某个值或区间修改。
代码:
#include<iostream> #include<algorithm> #include<stdio.h> #define lson (id*2) #define rson (id*2+1) using namespace std; long long tr[800005],lazy[800005],a[100005],ans; void pushup(int id) { tr[id]=tr[lson]+tr[rson]; } void pushdown(int id,int l,int r) { int mid=(l+r)/2; tr[lson]+=lazy[id]*(mid-l+1); tr[rson]+=lazy[id]*(r-mid); lazy[lson]+=lazy[id]; lazy[rson]+=lazy[id]; lazy[id]=0; } void build(int id,int l,int r) { if (l>r) return ; if (l==r) {tr[id]=a[l]; return ;} int mid=(l+r)/2; build(lson,l,mid); build(rson,mid+1,r); pushup(id); } void add(int id,int l,int r,int L,int R,long long c) { if (l>r || l>R || r<L) return ; if (l>=L && r<=R) { tr[id]+=(r-l+1)*c; lazy[id]+=c; return ; } int mid=(l+r)/2; pushdown(id,l,r); if (L<=mid) add(lson,l,mid,L,R,c); if (R>=mid+1) add(rson,mid+1,r,L,R,c); pushup(id); } void query(int id,int l,int r,int L,int R) { if (l>r || l>R || r<L) return ; if (l>=L && r<=R) { ans+=tr[id]; return ; } int mid=(l+r)/2; pushdown(id,l,r); if (L<=mid) query(lson,l,mid,L,R); if (R>=mid+1) query(rson,mid+1,r,L,R); pushup(id); } int n,m,x,y,c; char p[5]; int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,1,n); for (int i=1;i<=m;i++) { scanf("%s",p); if (p[0]=='C') { scanf("%d%d%d",&x,&y,&c); add(1,1,n,x,y,c); } else { ans=0; scanf("%d%d",&x,&y); query(1,1,n,x,y); printf("%lld\n",ans); } } }
相关文章推荐
- C++计时器
- c++第二次作业3
- C++双目运算符重载
- C++访问限定符
- c++第二次作业2
- BCD码转十进制C语言实现
- BCD码转十进制C语言实现
- BCD码转十进制C语言实现
- c++作业2
- 重载,类型转换和运算符
- dev -c++ 快捷键
- 15、C++基本概念----构造函数和析构函数
- C++primer第十二章读书笔记---动态内存与智能指针
- 转:C++宏中的“#”与“##”用法
- 【poj 2528】Mayor's posters 题意&题解&代码(C++)
- C++中虚析构函数的作用
- C++实验2-学生成绩
- C++的深拷贝与浅拷贝
- C语言学习005:不能修改的字符串
- OC语言实现从小到大冒泡排序