博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树基础
阅读量:4935 次
发布时间:2019-06-11

本文共 1586 字,大约阅读时间需要 5 分钟。

线段树:线段树用来储存区域信息

主要有五种操作:

建树、单点查询、单点修改、区间查询、区间修改。

注意和树状数组一样不能处理位置0

#include
using namespace std;//input by bxd#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define repp(i,a,b) for(int i=(a);i>=(b);--i)#define RI(n) scanf("%d",&(n))#define RII(n,m) scanf("%d%d",&n,&m)#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)#define RS(s) scanf("%s",s);#define ll long long#define pb push_back#define REP(i,N) for(int i=0;i<(N);i++)#define CLR(A,v) memset(A,v,sizeof A)//#define inf 0x3f3f3f3f#define lson l,m,pos<<1#define rson m+1,r,pos<<1|1const int N=100000+2;ll sum[N<<2],col[N<<2];void up(int pos){ sum[pos]=sum[pos<<1]+sum[pos<<1|1];}void down(int pos,int m){ if(col[pos]) { col[pos<<1]+=col[pos]; col[pos<<1|1]+=col[pos]; sum[pos<<1]+=col[pos]*(m-(m>>1)); sum[pos<<1|1]+=col[pos]*(m>>1); col[pos]=0; }}void build(int l,int r,int pos){ col[pos]=0; if(l==r) { scanf("%lld",&sum[pos]); return ; } int m=(l+r)>>1; build(lson); build(rson); up(pos);}void update(int L,int R,int v,int l,int r,int pos){ if(L<=l&&r<=R) { sum[pos]+=(r-l+1)*v; col[pos]+=v; return ; } down(pos,r-l+1); int m=(l+r)>>1; if(L<=m)update(L,R,v,lson); if(R>m)update(L,R,v,rson); up(pos);}ll query(int L,int R,int l,int r,int pos){ if(L<=l&&r<=R) { return sum[pos]; } down(pos,r-l+1); ll ans=0; int m=(l+r)>>1; if(L<=m)ans+=query(L,R,lson); if(R>m)ans+=query(L,R,rson); return ans;}
View Code

 

转载于:https://www.cnblogs.com/bxd123/p/10356042.html

你可能感兴趣的文章
智能合约安全前传-基础知识入门
查看>>
Myeclipse反编译插件
查看>>
Dubbo和Zookerper的关系
查看>>
centos 5 系统安装MYSQL5.7
查看>>
docker数据卷(转)
查看>>
地图定位及大头针设置
查看>>
oracle常用小知识点
查看>>
CATransform3D参数的意义
查看>>
"外部组建发生错误"
查看>>
怎么自己在Objective-C中创建代理
查看>>
svn检出maven工程到eclipse里面,部署到tomcat的步骤
查看>>
Under Armour Drive 4 Performance Reviews
查看>>
C#操作目录和文件
查看>>
警惕数组的浅拷贝
查看>>
百度地图 导航
查看>>
SQLServer 错误: 15404,无法获取有关 Windows NT 组
查看>>
html5全局属性
查看>>
【转】Android Hook框架Xposed详解
查看>>
Android 有用代码片段总结
查看>>
英语各种时态例句
查看>>