poj2528&&线段树模板
来源:互联网 发布:asp.net 开源论坛源码 编辑:程序博客网 时间:2024/06/06 09:14
线段树模板,先建树后,可实现查找,更新
#include <iostream>#include <stdio.h>using namespace std;#define N 111111long long sum[N<<2];//数组开的太大,要用宏定义,不然RElong long add[N<<2];void pushdown(int m,int rt){ if(add[rt]) { add[rt*2]+=add[rt]; add[rt*2+1]+=add[rt]; sum[rt*2]+=add[rt]*(m-(m/2)); sum[rt*2+1]+=add[rt]*(m/2); add[rt]=0; }}void build(int l,int r,int rt){ add[rt]=0; if(l==r) { scanf("%I64d",&sum[rt]); return ; } int mid=(r+l)/2; build(l,mid,rt*2); build(mid+1,r,rt*2+1); sum[rt]=sum[rt*2]+sum[rt*2+1];}void update(int l,int r,int rt,int L,int R,int c){ if(l<=L && r>=R) { sum[rt]+=(long long)c*(R-L+1); add[rt]+=c; return ; } pushdown(R-L+1,rt); int mid=(R+L)/2; if(l<=mid) update(l,r,rt*2,L,mid,c); if(r>mid) update(l,r,rt*2+1,mid+1,R,c); sum[rt]=sum[rt*2]+sum[rt*2+1];}long long query(int l,int r,int rt,int L,int R){ long long ans=0; if(l<=L && r>=R) return sum[rt]; pushdown(R-L+1,rt); int mid=(R+L)/2; if(l<=mid) ans+=query(l,r,rt*2,L,mid); if(r>mid) ans+=query(l,r,rt*2+1,mid+1,R); return ans;}int main(){ int n,m;scanf("%d%d",&n,&m); build(1,n,1); while(m--) { char ch[5];scanf(" %s",ch); int c,x,y; if(ch[0]=='Q') { scanf("%d%d",&x,&y); printf("%I64d\n",query(x,y,1,1,n)); } else { scanf("%d%d%d",&x,&y,&c); update(x,y,1,1,n,c); } } return 0;}/*10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4*/
阅读全文
0 0
- poj2528&&线段树模板
- 线段树(poj2528)
- poj2528---线段树
- 线段树 POJ2528
- poj2528(线段树)
- POJ2528线段树基础
- poj2528 线段树
- POJ2528线段树变体
- poj2528 离散线段树
- poj2528 线段树+离散化
- poj2528线段树+离散化
- 线段树典型例题--poj2528
- POJ2528 离散化线段树
- poj3264 poj3468 poj2528【线段树】
- POJ2528【线段树经典染色。】
- 线段树区间更新+poj2528
- poj2528(线段树+离散化)
- POJ2528 线段树区间覆盖
- 学习笔记6
- Servlet 文件上传
- centos7.2重新安装yum
- PTA 6-1 顺序表基本操作(10 分)
- 高德地图小实现
- poj2528&&线段树模板
- 在Python3.5下安装和测试Scrapy爬网站
- 弗洛伊德(Floyd)算法简单讲解,5行代码
- Git 的 4 个阶段的撤销更改
- 使用机器学习和数据挖掘算法进行数据处理
- Java Collectors的一些方法使用
- Servlet 生命周期
- 机器人走方格 51Nod
- 二叉树-递归算法