poj_3468线段树成段更新求区间和
来源:互联网 发布:周星驰喜欢林允吗 知乎 编辑:程序博客网 时间:2024/06/05 04:43
#include<iostream>#include<string.h>#include<cstdio>long long num[100010];using namespace std;struct st{ int l; int r; long long sum; long long a;} p[400100];void build(int t,int l,int r){ p[t].l=l; p[t].r=r; if(l==r-1) { p[t].sum=num[l]; return; } int mid=(l+r)/2; build(t*2+1,mid,r); build(t*2,l,mid); p[t].sum=p[t*2].sum+p[t*2+1].sum;}void update(int t,int l,int r,int v){ if(p[t].l==l&&p[t].r==r) { p[t].a += v;p[t].sum += v*(r -l);return ; } if( p[t].a ){p[2*t+1].a += p[t].a;p[2*t].a += p[t].a;p[2*t+1].sum += p[t].a*(p[2*t+1].r -p[2*t+1].l);p[2*t].sum += p[t].a*(p[2*t].r -p[2*t].l);p[t].a = 0;}int mid = (p[t].l+p[t].r)/2;if( l >= mid )update(2*t+1,l,r,v);elseif( r <= mid )update(2*t,l,r,v);else{update(2*t,l,mid,v);update(2*t+1,mid,r,v);}p[t].sum = p[2*t].sum + p[2*t+1].sum;}long long query(int t,int l,int r){if(p[t].l == l && p[t].r == r )return p[t].sum;if( p[t].a ){p[2*t+1].a += p[t].a;p[2*t].a += p[t].a;p[2*t+1].sum +=p[t].a*(p[2*t+1].r - p[2*t+1].l);p[2*t].sum += p[t].a*(p[2*t].r - p[2*t].l);p[t].a = 0;}int mid =(p[t].l+p[t].r)/2;if( l >= mid )return query(2*t+1,l,r);elseif( r <= mid )return query(2*t,l,r);elsereturn query(2*t,l,mid) + query(2*t+1,mid,r);}int main(){ int n,q; while(scanf("%d%d",&n,&q)!=EOF) { for(int i=0; i<n; i++) scanf("%lld",&num[i]); memset(p,0,sizeof(p)); build(1,0,n+1); getchar(); for(int i=0; i<q; i++) { char c; scanf("%c",&c); if(c=='Q') { int x,y; scanf("%d%d",&x,&y); getchar(); printf("%lld\n",query(1,x-1,y)); } else if(c=='C') { int x,y,z; scanf("%d%d%d",&x,&y,&z); getchar(); update(1,x-1,y,z); } } } return 0;}
0 0
- poj_3468线段树成段更新求区间和
- poj_3468,线段树成段更新
- A Simple Problem with Integers (POJ_3468) 线段树+区间更新
- POJ_3468 线段树--区间的动态赋值和求和
- 线段树求区间和(单点更新)
- 线段树 单点更新求区间和
- 【线段树-区间更新求区间和】CDOJ 1057
- hdu1166 敌兵布阵(线段树 求区间和 更新点)
- 线段树学习笔记(单点更新+区间查询最大值+lazy标记+pushdown操作+区间更新+求区间和)
- hdu1556 线段树区间更新 求单点
- HDOJ 1698 Just a Hook (线段树区间更新求区间和)
- 线段树-区间单个点更新-区间和-区间最大
- 【解题报告】 NYOJ 116 士兵杀敌(二) 线段树 单点更新求区间和
- HDOJ 1166 敌兵布阵(线段树单点更新求区间和)
- hdu1166敌兵布阵 树状数组&线段树 单点更新求区间和
- POJ_3468 A Simple Problem with Integers(线段树区间修改+附线段树模板)
- 线段树求区间和模板
- 线段树单点更新和区间查询
- 最长公共子序列问题LCS Longest Common Subsequence
- JPQL语法总结
- pulic继承方式下
- ubuntu14.04和window8.1双系统的安装和一些注意事项
- C语言中常见的内存错误与解决方法
- poj_3468线段树成段更新求区间和
- 基于内容的图像检索(颜色,直方图相交法,)java实现代码
- 2C02-View-Layout-Animation-list-Cascade
- UIButton事件的方法解释(一)
- linux 压缩文件的命令总结
- 织梦单页面自动更新的方法
- DataGridView绑定数据源
- NEFU 458 矩阵连乘
- C语言FILE读写操作