zkw线段树
zkw线段树
1.来源 zkw统计的力量
醍醐灌顶啊
zkw线段树是一颗满二叉树
001
010 011
100 101 110 111
也许有助于理解一些位运算
一.建树
for(M=1;M<=n;M<<=1);
for(int i=1;i<=n;i++){
a[i]=number();tr[M+i]=a[i];
}
M为叶子个数,前n层共M-1个点
M保证最后一层要有>n个点
注意,叶子节点的第一个不放东西(也就是tr[M])
二.维护
for(int i=M-1;i;i--)tr[i]=tr[i<<1]+tr[i<<1|1];
三.单点查询
return tree[M+i]
四.区间查询
这很有意思
比如说查询[s,t]
转换为开区间(s,t)
那么显然s的右节点,t的左节点是有用的
于是
for(int s=l[i]+M-1,t=r[i]+M+1;s^t^1;s>>=1,t>>=1){
if(~s&1)ans=max(aa,tr[s^1]);
if(t&1)ans=max(aa,tr[t^1]);
}
补充:~为按位取反
也就是如果s为左子树 就将他的右子树加进答案
也就是如果t为右子树 就将他的左子树加进答案
s^t^1意思是s,t为同一棵子树的左右节点
五.单点更新
void change(int k,int v){
tree[k+M]=v;
for(int i=k+M;i;i>>=1)tree[i]=tree[i<<1]+tree[i<<1|1];
}
六.区间更新
差分思想
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构