这是带上 lazy 标记的线段树板子
int a[N];
int ls(int p){return p << 1;}
int rs(int p){return p << 1|1;}
class SegmentTree{
public:
int tree[N << 2|1], tag[N << 2 |1];
inline void push_up(int p){
tree[p] = tree[ls(p)] + tree[rs(p)];
}
inline void add(int p, int pl, int pr, int d){
tree[p] += (pr - pl + 1)*d;
tag[p] += d;
}
inline void build(int p, int pl, int pr){
tag[p] = 0;
if(pl == pr){
tree[p] = a[pl];
return ;
}
int mid = (pl + pr) >> 1;
build(ls(p), pl, mid);
build(rs(p), mid + 1, pr);
push_up(p);
}
inline void push_down(int p, int pl, int pr){
if(tag[p]){
int mid = (pl + pr) >> 1;
add(ls(p), pl, mid, tag[p]);
add(rs(p), mid + 1, pr, tag[p]);
tag[p] = 0;
}
}
inline void update(int L, int R, int p, int pl, int pr, int d){
if(L <= pl && pr <= R){
add(p, pl, pr, d);
return ;
}
push_down(p, pl, pr);
int mid = (pl + pr) >> 1;
if(L <= mid){
update(L, R, ls(p), pl, mid, d);
}
if(R >= mid + 1){
update(L, R, rs(p), mid + 1, pr, d);
}
push_up(p);
}
inline int query(int L, int R, int p, int pl, int pr){
if(L <= pl && pr <= R){
return tree[p];
}
int mid = (pl + pr) >> 1;
push_down(p, pl, pr);
int res = 0;
if(L <= mid){
res += query(L, R, ls(p), pl, mid);
}
if(R >= mid + 1){
res += query(L, R, rs(p), mid + 1, pr);
}
return res;
}
};
SegmentTree seg;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!