首页 > 其他分享 >线段树学习笔记

线段树学习笔记

时间:2023-05-19 22:13:45浏览次数:42  
标签:rt int 线段 mid 笔记 学习 add push sum

让我们来一步一步理解!

 

1.向上更新

void push_up(int rt){//向上更新
    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}

 

2.向下更新

void push_down(int rt, int m){
    if(add[rt]){//若有标记,则将标记向下移动一层
        add[rt << 1] += add[rt];
        add[rt << 1 | 1] += add[rt];
        sum[rt << 1] += (m - (m >> 1)) * add[rt];
        sum[rt << 1 | 1] += (m >> 1) * add[rt];
        add[rt] = 0;//取消本层标记
    }
}

 

3.开始建树

void build(int l, int r, int rt){//建树
    add[rt] = 0;
    if(l == r){
        scanf("%lld", &sum[rt]);
        return;
    }
    int mid = (l + r) >> 1;
    build(lson);
    build(rson);
    push_up(rt);//向上更新
}

 

4.区间更新

void update(int L, int R, ll key, int l, int r, int rt){//区间更新
    if(L <= l && R >= r){
  //该区间是完整的
        sum[rt] += (r - l + 1) * key;
        add[rt] += key;
        return;
    }
    push_down(rt, r - l + 1);//向下更新,下传标记
    int mid = (l + r) >> 1;
    if(L <= mid) update(L, R, key, lson);
    if(R > mid) update(L, R, key, rson);
    push_up(rt);//向上更新
}

 

5.区间求和

int query(int L, int R, int l, int r, int rt){//区间求和
    if(L <= l && R >= r) return sum[rt];
    push_down(rt, r - l + 1);//向下更新
    int mid = (l + r) >> 1;
    int ans = 0;
    if(L <= mid) ans += query(L, R, lson);
    if(R > mid) ans += query(L, R, rson);
    return ans;
}

 

例题:poj 3468 3468 -- A Simple Problem with Integers (poj.org)

 

线段树裸题!

#include<bits/stdc++.h>
#define ll long long
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1

using namespace std;

const int MAXN = 1e5 + 10;
ll sum[MAXN << 2];
ll add[MAXN << 2];

void push_up(int rt){//向上更新
    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}

void push_down(int rt, int m){
    if(add[rt]){//若有标记,则将标记向下移动一层
        add[rt << 1] += add[rt];
        add[rt << 1 | 1] += add[rt];
        sum[rt << 1] += (m - (m >> 1)) * add[rt];
        sum[rt << 1 | 1] += (m >> 1) * add[rt];
        add[rt] = 0;//取消本层标记
    }
}

void build(int l, int r, int rt){//建树
    add[rt] = 0;
    if(l == r){
        scanf("%lld", &sum[rt]);
        return;
    }
    int mid = (l + r) >> 1;
    build(lson);
    build(rson);
    push_up(rt);//向上更新
}

void update(int L, int R, ll key, int l, int r, int rt){//区间更新
    if(L <= l && R >= r){
        sum[rt] += (r - l + 1) * key;
        add[rt] += key;
        return;
    }
    push_down(rt, r - l + 1);//向下更新
    int mid = (l + r) >> 1;
    if(L <= mid) update(L, R, key, lson);
    if(R > mid) update(L, R, key, rson);
    push_up(rt);//向上更新
}

ll query(int L, int R, int l, int r, int rt){//区间求和
    if(L <= l && R >= r) return sum[rt];//该区间完整
    push_down(rt, r - l + 1);//向下更新
    int mid = (l + r) >> 1;
    ll ans = 0;
    if(L <= mid) ans += query(L, R, lson);
    if(R > mid) ans += query(L, R, rson);
    return ans;
}

int main(void){
    int n, m;
    scanf("%d%d", &n, &m);
    build(1, n, 1);
    while(m--){
        char op[3];
        int x, y;
        ll z;
        scanf("%s", op);
        if(op[0] == 'C'){
            cin>>x>>y>>z;
            update(x, y, z, 1, n, 1);
        }else{
            cin>>x>>y;
            printf("%lld\n", query(x, y, 1, n, 1));
        }
    }
}

 

标签:rt,int,线段,mid,笔记,学习,add,push,sum
From: https://www.cnblogs.com/Miya555/p/17416435.html

相关文章

  • Redis笔记(三):事务
    什么是Redis事务Redis事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。总结说:redis事务就是一次性、顺序性、排他性的执行一个......
  • es笔记六之聚合操作之指标聚合
    本文首发于公众号:Hunter后端原文链接:es笔记六之聚合操作之指标聚合聚合操作,在es中的聚合可以分为大概四种聚合:bucketing(桶聚合)mertic(指标聚合)matrix(矩阵聚合)pipeline(管道聚合)bucket类似于分类分组,按照某个key将符合条件的数据都放到该类别的组中mertic计......
  • kubebuilder笔记
    一、kubebuilder作用提供脚手架工具初始化CRDs工程,自动生成boilerplate代码和配置提供代码库封装底层的K8sgo-client二、kubebuilder整体流程用户自定义crd,将自定义的crd注册到scheme中,这样通过GVK能找到对应的go的struct,也能通过go的struct找对对应的GVKCache监听S......
  • 人月神话 读书笔记 03
    第9章削足适履9.1程序有多大?除了运行时间以外,它所占据的空间也是主要开销。当系统设计者认为对用户而言,常驻程序内存的形式比加法器、磁盘等更加有用时,他会将硬件实现中的一部分移到内存上。相反的,其他的做法是非常不负责任的。由于规模是软件系统产品用户成本中如此大的一个......
  • 人件集 人性化的软件开发阅读笔记03
    《人件集人性化的软件开发》第三部分工作组织第八章:团队的目标和规划这一章主要讲述如何制定合理的团队目标和规划,以及如何实现这些目标和规划。作者提出,确定特定的、可衡量的目标,并建立一个可靠的评估机制,以便团队能够不断改进和实现更好的效果。我认为这一章非常实用,对于团......
  • 横向对比 11 种算法,多伦多大学推出机器学习模型,加速长效注射剂新药研发
    内容一览:长效注射剂是解决慢性病的有效药物之一,不过,该药物制剂的研发耗时、费力,颇具挑战。对此,多伦多大学研究人员开发了一个基于机器学习的模型,该模型能预测长效注射剂药物释放速率,从而提速药物整体研发流程。关键词:长效注射剂机器学习嵌套交叉验证本文首发自HyperAI超神经......
  • Redis笔记(二):三种特殊类型
    geospatial地理位置GEOADDkey[NX|XX][CH]longitudelatitudemember[longitudelatitudemember...]地球两极无法直接添加经度纬度GEODIST#单位m,km,mi,ftGEOHASHGEOPOSGEORADIUSGEORADIUSBYMEMBERJava中的数据结构......
  • sqli-lab学习笔记(学习笔记)(1-10)
    经常会犯的错误:1.在hackbar里面忘记用%23替代#2.在用下一条语句的时候忘记更改limit的值导致结果显示不出来3.双注入里面的语句忘记加()日志是我后来想到发的,前面几关也都基础简单的,giantbranch大佬写的挺好的很详细,我也是按他的一步步学习来的,然后在里面增加自己的知识点和......
  • ④ActiveMQ 与 SpringBoot 集成——(动力节点)ActiveMQ笔记
    第四章ActiveMQ与SpringBoot集成4-1ActiveMQ与SpringBoot集成集成配置1、加载springboot的activeMQ的依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><depen......
  • DNS相关命令ping、host、nslookup、dig、nsupdate学习
    另外再标注一篇文章:http://zhumeng8337797.blog.163.com/blog/static/10076891420112108424555/1、ping  很好奇为什么返回的是www.a.shifen.com,whois一下:发现shifen.com也是百度的。  这个在知乎上也有相关回答:十分系统(www.a.shifen.com)是干什么的?和百度有什么关系? 2、host ......