关于线段树的作用与其他数据结构的替代

众所周知,sgt十分难写 并且如果模板记错 调试难度也十分大,然而今天我在写树剖的时候突发奇想,我们是否可以用一些数据结构代替线段树?以下是我的一些总结:
1.区间修改单点查询
这个十分简单 基本的查分用树状数组维护就好了
代码实现:略
2.区间修改区间查询
2相比1提高了许多难度,不过2个树状数组依旧是可以解决的,第一个树状树状为S1 第二个为S2,S1维护基本的查分,S2维护di*i 原理如下
显然有如下公式:
ai=xi=1

然后得:
xi=1ai=xi=1ij=1di

继续推得:
xi=1ai=xi=1(xi+1)di

最后化简一下就发现2个数组啦:
xi=1ai=xi=1(x+1)dixi=1dii

代码如下啦啦啦:
void add(int x,int y)
{for(int i=x;i<=n;i+=lb(i)) c1[i]+=y,c2[i]+=(long long)x*y;}
long long sum(int x)
{
    long long ans(0);
    for(int i=x;i;i-=lb(i)) ans+=(x+1)*c1[i]-c2[i];
    return ans;
}

我有恶意压行嫌疑 但显然不长不是喵!
3.区间最大最小值
哈!一道RMQ好题!我一般是用ST表写 这里直接上代码吧

for(int j=1;(1<<j)<=n;j++)
    for(int i=1;i<=n+1-(1<<j);i++)
    f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
k=int(log2(r-l+1));
        printf("%d\n",max(f[l][k],f[r-(1<<k)+1][k]));

十分简洁啧啧啧 然后我们的线段树就如此被替代了?不然。。。RMQ只能离线。。。。。。。。。。。。。。。。
4.区间乘法!
显然将 换成 就ok了 但是如果乘加交替的话,貌似比较难维护,博主正在辛勤研究ing~~ 好了最后谢谢大家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值