线段树模板

news/2024/11/6 13:51:41/

线段数的查询和修改都是logn的。

struct node{int l,r;int v;
}tr[N*4];//经验值*4void pushup(int u)
{tr[u].v=max(tr[u<<1].v,tr[u<<1+1].v);
}
void built(int u,int l,int r)
{tr[u]={l,r};if(l==r) return;int mid=l+r>>1;	built(u<<1,l,mid);//建树时候这里是midbuilt(u<<1+1,mid+1,r);	
}int query(int u,int l,int r)
{if(tr[u].l>=l&&tr[u].r<=r) return tr[u].v;int mid=tr[u].l+tr[u].r>>1;int v=0;if(l<=mid) v=query(u<<1,l,r);//注意这里依旧是查询l,rif(r>mid) v=max(v,query(u<<1+1,l,r));
}
void modify(int u,int x,int v)
{if(tr[u].l==x&&tr[u].r==x) tr[u].v=v;else{int mid=tr[u].l+tr[u].r>>1;if(x<=mid) modify(u<<1,x,v);else modify(u<<1+1,x,v);pushup(u);		}}

区间修改,区间查询(pushdown操作)

pushdown操作的定义为,给该区间的子区间,每个区间加上一些东西。

由于pushdown有延时性,所以每次在query或者modify时应该先pushdown操作一下

#include<bits/stdc++.h>using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int g[N];
struct node{int l,r;LL sum,add;
}tr[N*4];int n,m;
void pushup(int u)
{tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void pushdown(int u)
{auto &root=tr[u],&left=tr[u<<1],&right=tr[u<<1|1];if(root.add){left.add+=root.add,left.sum+=(LL)(left.r-left.l+1)*root.add;right.add+=root.add,right.sum+=(LL)(right.r-right.l+1)*root.add;root.add=0;}
}
void built(int u,int l,int r)
{if(l==r) tr[u]={l,r,g[r],0};else{tr[u]={l,r};int mid=l+r>>1;built(u<<1,l,mid);built(u<<1|1,mid+1,r);pushup(u);}
}
void modify(int u,int l,int r,int d)
{if(tr[u].l>=l&&tr[u].r<=r){tr[u].sum+=(LL)(tr[u].r-tr[u].l+1)*d;tr[u].add+=d;}else{pushdown(u);//注意这里的pushdown操作int mid=tr[u].r+tr[u].l>>1;if(l<=mid) modify(u<<1,l,r,d);if(r>mid) modify(u<<1|1,l,r,d);pushup(u);}
}
LL query(int u,int l,int r)
{if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;pushdown(u);//注意这里的pushdown操作int mid=tr[u].l+tr[u].r>>1;LL sum=0;if(l<=mid) sum=query(u<<1,l,r);if(r>mid) sum+=(LL)query(u<<1|1,l,r);return sum;
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>g[i];built(1,1,n);char op[2];int l,r,d;while(m--){cin>>op>>l>>r;if(*op=='Q'){cout<<query(1,l,r)<<endl;}else{cin>>d;modify(1,l,r,d);}}return 0;
}


http://www.ppmy.cn/news/882763.html

相关文章

Raft算法之日志复制

Raft算法之日志复制 一、日志复制大致流程 在Leader选举过程中&#xff0c;集群最终会选举出一个Leader节点&#xff0c;而集群中剩余的其他节点将会成为Follower节点。Leader节点除了向Follower节点发送心跳消息&#xff0c;还会处理客户端的请求&#xff0c;并将客户端的更…

暑假第七天打卡

离散&#xff1a; 主析取范式和主合取范式的应用&#xff1a; &#xff08;1&#xff09;求公式成真与成假赋值&#xff1a; 化为主析取范式后&#xff0c;下标化为二进制就是成真赋值&#xff0c;不在下标里的就是成假赋值 化为主合取范式后&#xff0c;下标化为二进制就是…

系统架构设计师 8:系统质量属性与架构评估

软件系统属性包括功能属性和质量属性&#xff0c;软件架构重点关注的是质量属性。为了精确、定量地表达系统的质量属性&#xff0c;通常会采用质量属性场景的方式进行描述。 在确定软件系统架构&#xff0c;精确描述质量属性场景后&#xff0c;就需要对系统架构进行评估。软件…

内存条频率4000MHZ,开启XMP技术内存读写速度前后对比图

测试环境&#xff1a;CPU为core i9-7900x 内存&#xff1a;双通道 4000MHZ 主板&#xff1a;MSI X299 Pro 未开启XMP的内存读写速度测试&#xff08;双通道 2*8GB&#xff09; 开启XMP后内存读写速度测试&#xff08;双通道2*8GB&#xff09; 开启XMP后单通道单内存条内存读取…

台风怎么看内存颗粒_【无趣】使用300多元的D4 16G内存是种什么体验

long long ago&#xff0c;我买到四根酷兽DDR4 2666的16G内存条。记得那时候还没有火灾&#xff0c;地区也没有大停电&#xff0c;内存也还是白菜价&#xff0c;那时这根16G内存仅199元&#xff0c;4根才只要800元而已。而三个月后的今天&#xff0c;这条内存已经涨到了339元一…

r720支持多少频率的内存吗_2020年十一月电脑内存选购指南,如果选择性价比内存条(内存天梯)...

买内存条时,首先要考虑自己要不要超频,如果不考虑超频,只需要考虑选择哪个品牌,购买多大的内存,多少频率的内存即可。 推荐品牌:芝奇、威刚、金士顿、海盗船、英睿达、科赋、十铨、光威、阿斯加特、宇瞻等 国产内存:光威(奕系列)纯国产内存(长鑫颗粒)不需要超频可以…

spd不能修改服务器内存条的原因,修改内存SPD 解决蓝屏问题

修改内存SPD 解决蓝屏问题 互联网 发布时间:2009-04-21 01:18:13 作者:佚名 我要评论 问:一台电脑的内存是HY 256MB DDRII 533,最近又购买了一条HY 256MB DDRII 533内存,与原有内存组成双通道。使用时偶尔会出现蓝屛,朋友说这是由于两条内存SPD不一致造成的,请问…

SQL语法与数据库快速入门(1)

目录 数据库简介数据库分类常用数据库简介使用场景MySql 的安装与配置数据库客户端工具MySql 介绍SQL 简介DDL 数据库操作-创建DDL 数据库操作-查看DDL 数据库操作-修改DDL 数据库操作-删除DDL 数据库表操作简介DDL 数据库表操作-创建DDL 数据库表操作-查看DDL 数据库表操作-修…