线段树系列-pku-3468-A Simple Problem with Integers-区间修改区间求和
2015-12-30 20:21
507 查看
一道简单的区间修改区间求和
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; struct seg { int l,r,fa; long long sum,more; }tree[401111]; void build(int l,int r,int k) { tree[k].l=l; tree[k].r=r; tree[k].fa=0; //FA==1表示有该线段的加值 tree[k].more=0; //more表示该线段的附加值 if(l==r) { tree[k].sum=a[l]; tree[k].fa=1; return; } int mid = (l+r) >> 1; build(l,mid,2*k); build(mid+1,r,2*k+1); tree[k].sum=tree[2*k].sum+tree[2*k+1].sum; //除附加值以外的和 } void update(int l,int r,long long v,int k) { if(tree[k].l==l&&tree[k].r==r) { //如果就是所加线段,直接赋值上附加值 tree[k].more+=v; tree[k].fa=1; //并且标记 return; } int mid =(tree[k].l+tree[k].r) >> 1; if (r<=mid) update(l,r,v,2*k); else if(l>mid) update(l,r,v,2*k+1); else { update(l,mid,v,2*k); update(mid+1,r,v,2*k+1); } tree[k].sum+=v*(r-l+1); //因为不是对附加值进行操作,所以对sum进行加值 } long long query(int l,int r,int k) { long long ans=0; if(tree[k].fa==1) { //统计是否有对应线段的附加值*点数 ans+=tree[k].more*(r-l+1); } if(tree[k].l==l&&tree[k].r==r) { ans+= tree[k].sum; return ans; } int mid=(tree[k].l+tree[k].r)>>1; if(r<=mid) return ans+query(l,r,2*k); // else if(l>mid) return ans+query(l,r,2*k+1); else { return ans+query(l,mid,2*k)+query(mid+1,r,2*k+1); } } int main() { int n,q; char s[10]; scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,n,1); while(q--) { scanf("%s",s); if(s[0]=='Q') { long long tot; int x,y; scanf("%d%d",&x,&y); tot=query(x,y,1); printf("%lld\n",tot); } else { int x,y; long long v; scanf("%d%d%lld",&x,&y,&v); update(x,y,v,1); } } return 0; }
相关文章推荐
- stringByAppending 各种方法使用...
- 05 旋转数组中的最小数字
- map data compressed algorithm
- iOS开发上传头像
- Javascript面向对象及组件详细介绍(五)原型链
- VS中使用Beyone Compare 进行Diff
- 自己使用 2.常量变量,数据类型,数据的输入输出。
- 《Python语言程序设计》前四章学习记录
- jdGrid的使用
- 《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文
- leetcode刷题日记——Find Minimum in Rotated Sorted Array II
- 安利一下翻*的东东QAQ
- tableView上有多个输入框时候,如何不让键盘挡住输入框
- linux虚拟机与win主机之间ping通以及其他网络设置
- 《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文
- hdu3416 Marriage Match IV(最短路+网络流)
- 五种循环
- 启动zookeeper时出现的问题
- Javascript面向对象及组件详细介绍(四)包装对象
- 脑机接口技术的未来之驳