良心!良心!十分良心的zkw线段树(更新中)

本文详细介绍ZKW线段树的构造与应用,包括造树、单点查询及修改等核心操作,并提供实用代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在zkw线段树前的话

  • zkw线段树出处清华大学 张昆玮ppt《统计的力量》

链接:http://wenku.baidu.com/view/0c1bbba40029bd64783e2cca.html

  • 写这篇博文的原因:好写!实用!
  • 但有的题只能用回溯
  • zkw线段树可以直接查看叶子结点

zkw线段树长什么样??(以长度为7为例)

就凑合着看吧
把编号换做二进制看看
这里写图片描述
发现好多规律:
1. 左儿子是i<<1,右儿子是(i<<1)+1
2. 直接找到叶子(不用搜索)
3. …………

一:造树

首先开空间:
如何开空间?
1. 如果空间够直接开4倍
2. 不够就着大于区间长度的2^m*2(2^m>n)如果n=8,就开32

好了空间开完了,接下来就到植树造林的时间了
1. 叶子们

while(m<=n)m<<=1;
for(int i=m+1;i<=m+n;i++)
    scanf("%d",&segtree[i]);

好了叶子就有值了
2. 父亲们
- 区间和

for(int i=m-1;i>=1;i--)
    segtree[i]=segtree[i<<1]+segtree[(i<<1)+1];
  • 区间最值
for(int i=m-1;i>=1;i--)
    segtree[i]=max(segtree[i<<1],segtree[(i<<1)+1]);

for(int i=m-1;i>=1;i--)
    segtree[i]=min(segtree[i<<1],segtree[(i<<1)+1]);

于是一棵zkw线段树就被我们用四行代码造好了
zkw线段树值呀!!
##二:单点查询与修改
1. 单点查询:直接找叶子
2. 单点修改:

scanf("%d%d",&x,&y);
segtree[x+m].sum=y;
for(int i=(x+m)>>1;i;i>>=1) 
    segtree[i].sum=segtree[i<<1].sum+segtree[(i<<1)^1].sum;

于是一棵zkw线段树就被我们用改好了
zkw线段树值呀!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值