线段树Segment tree(1):单点修改,区间查询

2023-11-17

问题描述: 给定数列a[1],a[2],…,a[N],依次进行Q次操作,操作有两类:
1 i x: 给定i,x,将a[i]加上x
2 l r: 给定i,x,求 ∑ i = l r \sum_{i=l}^r i=lra[i]

代码
// TSWorld
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 400005;

struct Node
{
    long long left;
    long long right;
    long long sum;
    struct Node *LeftNode;
    struct Node *RightNode;
};

long long number[N];

inline void Built(struct Node *cur,int l,int r)
{
    cur->left = l;
    cur->right = r;
    if(l==r)
    {
        cur->LeftNode = NULL;
        cur->RightNode = NULL;
        cur->sum = number[l];
        return;
    }
    else
    {
        cur->LeftNode = new Node;
        cur->RightNode = new Node;
        Built(cur->LeftNode,l,(l+r)/2);
        Built(cur->RightNode,(l+r)/2+1,r);
    }
    cur->sum = cur->LeftNode->sum + cur->RightNode->sum;
}

inline long long query(struct Node *cur,long long l,long long r)
{
    // 查询区间覆盖了当前节点
    if((l <= cur->left)&&(cur->right <=r))
        return cur->sum;
    else
    {
        long long ans = 0;

        // 当前节点左子树有查询区间
        if(l <= (cur->left + cur->right)/2)
            ans += query(cur->LeftNode,l,r);
        // 当前节点右子树有查询区间
        if(r > (cur->left + cur->right)/2)
            ans += query(cur->RightNode,l,r);   
        return ans;
    }
}

inline void updata(struct Node *cur,long long address,long long data)
{
    if(cur->left == cur->right)
    {
        cur->sum += data;
        return;
    }

    if(address <= (cur->left + cur->right)/2)
        updata(cur->LeftNode,address,data);
    else
        updata(cur->RightNode,address,data);

    cur->sum = cur->LeftNode->sum + cur->RightNode->sum;
}
int main()
{
    long long n = 0,q = 0,cmd = 0;
    long long x = 0,y = 0;
    struct Node *root = new Node;
    scanf("%lld%lld",&n,&q);

    for(int i = 1;i <= n;i++)
        scanf("%lld",&number[i]);

    Built(root,1,n);

    for(int i = 1;i <= q;i++)
    {
        scanf("%lld%lld%lld",&cmd,&x,&y);
        if(cmd == 1)
            updata(root,x,y);
        else
            printf("%lld\n",query(root,x,y));
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线段树Segment tree(1):单点修改,区间查询 的相关文章

  • 二维线段树【模板——给出对应注释】

    闲话少说 直接看注释反而会更容易读懂这段二维线段树的模板 include
  • 创建Vue3.0工程和常用 Composition API

    一 创建Vue3 0工程 1 使用 vue cli 创建 官方文档 https cli vuejs org zh guide creating a project html vue create 查看 vue cli版本 确保 vue cl
  • spring boot配置类注册深入解析

    前言 spring ApplicationContext的刷新总体来看有两个过程 第一个是注册BeanDefinition 提供整个IOC容器初始化的材料 第二个是根据BeanDefinition加载bean 从spring boot开始
  • Ubuntu操作遇到的报错解决方法汇总(持续更新)

    1 在anaconda中创建了虚拟环境并安装了pytorch 但是编译过程中仍然报没有torch的错误 CMake Error at crawler crane crane tutorials CMakeLists txt 23 find
  • Snowy Smile【扫描线】【2019 杭电多校6】

    HDU 6638 题目链接 比赛的时候只在拼命的想怎么去优化O N 3 的那个之前所认为的标准解法 没想到 这就是一道O N 2 logN 的扫描线 我们可以固定上下两个区间 然后在固定的区域中 就是一维的空间了 我们直接在这一维里去查询即
  • STA(静态时序分析) 详解:如何计算最大时钟频率,以及判断电路是否出现时钟违例(timing violation)?

    1 什么是STA STA 静态时序分析 是时序验证的一种方法 用于计算和分析电路是否满足时序约束的要求 2 为什么需要STA 电路能否正常工作 其本质上是受最长逻辑通路 即关键路径 的限制 以及受芯片中存储器件的物理约束或工作环境的影响 为
  • : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi

    出现这种报错的原因一定是sql语句写错了 报错 分析 解决方案 在这种报错的情况下 1 看字段是否写错 2 是否多逗号或者少写逗号 3 sql语句本身语法有没有错误
  • Jenkins以root用户运行

    Jenkins安装完成后默认会创建一个jenkins的用户 并以jenkins用户运行 在我们通过jenkins编写一些命令的时候容易出现权限不足的提示 permision denied 通过为jenkins工作区赋予777的权限以后 也可
  • r语言写九九乘法表并保存为txt文件

    r语言写九九乘法表并保存为txt文件 代码 for i in 1 9 for j in 1 i cat j x i i j t file 九九乘法表 txt append TRUE cat n file 九九乘法表 txt append T
  • 小白的成长轨迹(二):披荆斩棘,未来可期

    大家好 我是孤焰 一名双非本科的大四学生 又是一年的1024 我坚持撰写博客已经为期一年 很感谢大家一直以来的支持 在这一年期间这位名为 孤焰 的少年又有哪些成长呢 下面便请细听分说 希望这些成长经历可以对正在看这篇文章的小可爱们有一些帮助
  • Arduino ESP32自平衡小车制作实现(不需编码器)

    1 mpu6050陀螺仪角度方向和静态平衡角度测试 说明 1 陀螺仪补偿值的计算 试时提前用calcGyroOffsets true 函数计算出 补偿值 知道mpu6050的补偿值后用setGyroOffsets 直接设置补偿值 避免每次开
  • yolo v3 fatal : Memory allocation failure

    torch版的 yolov3报错 fatal Memory allocation failure parser add argument n cpu type int default 8 help number of cpu threads
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • kafka的安装和使用

    ZooKeeper简介 ZooKeeper 是一个为分布式应用所设计的分布的 开源的 java 协调服务 分布式的应用可以建立在同步配置管理 选举 分布式锁 分组和命名等服务的更高级别的实现的基础之上 ZooKeeper 意欲设计一个易于编
  • 什么是protocol分层,垂直service??计算机网络详解【计算机网络养成】

    内容导航 分组丢失和延时 发生原因 四种分组延时 节点处理延迟 排队延迟 传输延时 Transmission 传播延时 Propagation 使用cmd命令tracert 和 tracerert 来检查延迟 分组丢失 吞吐量 有效的数据量
  • 一步步实现扫雷

    扫雷 首先去建立三个文件 头文件 game h 用于存放每个函数的声明 源文件1 game c 用于放置每个函数的定义 源文件2 test c 用于实现扫雷的整体逻辑 关于扫雷的实现 首先需要定义棋盘 这里我们实现9 9的棋盘 但是面对用户
  • java项目抠图功能实现

    java项目抠图功能 项目中需要一个上传文字签名并且抠掉背景图的功能 当初第一次听到这个需求时 差点惊掉下巴 我压根都不会觉得java里能实现这功能 但是既然客户需要 那就照办吧 经过这次功能的实现 我也更加坚定了一个想法 再奇葩的需求 也
  • 星星之火-22: 什么是手机小区重选?跳槽

    小区重选 cell reselection 指手机在空闲模式下 通过监测邻区和当前小区的信号质量以选择一个最好的小区提供服务信号的过程 选择了一家新公司 并不意味着永久待在一家公司 当前服务的公司 有可能由于经营状况变变糟 薪资水平下降 也
  • lyapunov直接法

    文章目录 定义6 6 Lyapunov第一定理 Lyapunov第二定理 用于刻画渐进稳定 内积分析 定义6 6 Lyapunov第一定理 假设 A C A subset C A C是闭的 如果存在A的邻域D和满足下面两条件的连续函数
  • 【已解决】vs2015下QtnetWork No Such File or Directory报错

    源于笔者在做qt工具时 遇到的一个问题 问题很直观 加载第三方文件时 第三方文件调用了 include

随机推荐