wikioi 1082 线段树练习 3
2014-04-15 20:32
309 查看
http://wikioi.com/problem/1082/
线段树,区间更新,区间求和,最好用到懒散标记。
线段树的学习,可以参考
http://www.notonlysuccess.com/index.php/segment-tree-complete/
线段树,区间更新,区间求和,最好用到懒散标记。
线段树的学习,可以参考
http://www.notonlysuccess.com/index.php/segment-tree-complete/
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; # define inf -10000000 long long sum[800100],tag[800100]; void pushup(int root)//向上更新sum { sum[root] = sum[2*root] + sum[2*root + 1]; } void pushdown(int root,int num)//向下修改,更新左右孩子 { tag[2*root] += tag[root]; tag[2*root + 1] += tag[root]; sum[2*root] +=(num - num/2) * tag[root]; sum[2*root + 1] += (num/2) * tag[root]; tag[root] = 0;//tag 标记为0 } void build(int l,int r,int root) { tag[root] = 0;//tag 初始化 if(l == r) { scanf("%lld",&sum[root]); return ; } else { int mid = (l+r)/2; build(l,mid,2*root);//建立左子树 build(mid+1,r,2*root+1);//建立右子树 pushup(root); } } void update(int L,int R,int v,int l,int r,int root) { if(L <= l && R >= r)//找到区间,更新sum 并修改 懒散标记 { sum[root] += (r - l + 1)*v; // 区间内每个值都增加 tag[root] += v; return ; } pushdown(root,r-l+1); int mid = (l+r)/2; if(L <= mid)update(L,R,v,l,mid,2*root); if(R>mid)update(L,R,v,mid+1,r,2*root+1); pushup(root);// 向上传递sum } long long getsum(int L,int R,int l,int r,int root) { if(L<= l && R >= r) return sum[root];//找到查询区间,返回sum 值 pushdown(root,r-l+1);// 向下边修改边查询,查询过程中访问到的区间会用到增量 int mid = (l + r)/2; long long res = 0; if(L <= mid) res += getsum(L,R,l,mid,2*root); if(R>mid) res += getsum(L,R,mid+1,r,2*root+1); return res; } int main() { int n,m,a,b,c,d; scanf("%d",&n); build(1,n,1); scanf("%d",&m); while(m--) { scanf("%d%d%d",&a,&b,&c); if(a == 1) { scanf("%d",&d); update(b,c,d,1,n,1); } else { printf("%lld\n",getsum(b,c,1,n,1)); } } return 0; }
相关文章推荐
- 对称矩形
- 避免头文件的多重包含
- 异常处理:你不可能总是对的2 - 零基础入门学习Python033
- hdu 1879 继续畅通工程
- 黑马程序员_银行业务调度系统
- Windows学习心得【计时器1】
- cuda学习
- 百度有意退出安全联盟 继续保护钓鱼网站利益?
- poj 2255
- java学习总结——第十一天
- 微软面试100题之18题:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始... ...
- 生物信息学数据库--介绍
- nyoj_68_三点顺序_201404152013
- lua -- mysql导出json
- 要想逻辑好,补脑是关键
- 百度搜索上线安全联盟侵权举报中心
- DCT JAVA
- RMI原理及简单示例
- Hadoop安装与编程(一)——安装部分
- 百度搜索V认证生存浅析