首页 > 其他分享 >线段树的一种简单实现

线段树的一种简单实现

时间:2023-09-09 09:12:51浏览次数:32  
标签:Node RightSon const 实现 线段 int LeftSon 简单 Sum

发现之前没有整理过线段树的代码,填一下坑。

int Array[maxn];

class SegmentTree{
  public:
  SegmentTree* BuildTree(const int L,const int R){
    SegmentTree *Node=new SegmentTree;
    Node->l=L,Node->r=R;
    Node->Tag=0;
    if(L==R){
      Node->LeftSon=Node->RightSon=nullptr;
      Node->Sum=Array[L];
    }else{
      int Mid=(L+R)>>1;
      Node->LeftSon=BuildTree(L,Mid);
      Node->RightSon=BuildTree(Mid+1,R);
      Node->Update();
    }
    return Node;
  }

  inline bool InRange(const int L,const int R){
    return (L<=l)&&(r<=R);
  }

  inline bool OutOfRange(const int L,const int R){
    return (R<l)||(r<L);
  }

  inline void MakeTag(const int Add){
    Tag+=Add;
    Sum+=(r-l+1)*Add;
  }

  inline void PushDown(){
    if(Tag){
      LeftSon->MakeTag(Tag);
      RightSon->MakeTag(Tag);
      Tag=0;
    }
  }

  inline void Update(){
    Sum=LeftSon->Sum+RightSon->Sum;
  }

  void Modify(const int L,const int R,const int Add){
    if(InRange(L,R)) MakeTag(Add);
    else if(!OutOfRange(L,R)){
      PushDown();
      LeftSon->Modify(L,R,Add);
      RightSon->Modify(L,R,Add);
      Update();
    }
  }

  int GetSum(const int L,const int R){
    if(InRange(L,R)) return Sum;
    if(OutOfRange(L,R)) return 0;
    PushDown();
    return LeftSon->GetSum(L,R)+RightSon->GetSum(L,R);
  }

  private:
  int l,r;
  int Sum,Tag;
  SegmentTree *LeftSon,*RightSon;
}*Root;

/*
在主函数中 Root=Root->BuildTree(L,R);
*/

标签:Node,RightSon,const,实现,线段,int,LeftSon,简单,Sum
From: https://www.cnblogs.com/zaza-zt/p/17688891.html

相关文章

  • mysql实现商品分类功能
    目录概述1.0表的创建2.0主分类2.1数据添加与查询3.0子分类3.1数据添加3.2数据查询概述#1.0系统环境:windows10#2.0mysql版本:mysql8.0.2#3.0可视化软件:jetbrainsdatagrip20221.0表的创建#产品(商品)分类功能#分类表createtablecategory(idint2aut......
  • python实现输入一个字符串,输出第m个只出现过n次的字符
    功能需求输入一个字符串str,输出第m个只出现过n次的字符功能分析1:定义一个函数,函数传入三个参数,分别是输入的字符串、第m个、n次。2:统计每个字符在字符串中出现的次数,然后按照出现次数进行排序。3:找到第m个只出现n次的字符并输出。程序实现deffind_char(str,m,n):#统......
  • m基于FPGA的costas环载波同步verilog实现,包含testbench,可以修改频偏大小
    1.算法仿真效果其中Vivado2019.2仿真结果如下: 没有costas环,频偏对基带数据的影响   加入costas环的基带数据   2.算法涉及理论知识概要        Costas环是一种用于载波同步的常见方法,特别是在调制解调中,它被广泛用于解调相位调制信号,如二进制调相(BPS......
  • PHP7内核实现原理-启动过程
    FPM启动和初始化worker的过程代码在源码/sapi/fpm/fpm/fpm_main.c中fpm_conf_init_main()函数解析php-fpm.conf配置文件,分配workerpool的内存空间。每个workerpool用结构体fpm_worker_pool_s表示,每个pool中的有一个fpm_scoreboard_s结构体,用来管理具体一个......
  • PHP7内核实现原理-基本环境和C基础
    编译安装PHP7.1.0下载7.1.0源码压缩包:www.php.net/releases/./configure--prefix=/Users/lisong/Documents/workspace/php-src/output--enable-fpm编译,报错:configure:error:Pleasespecifytheinstallprefixoficonvwith--with-iconv=iconv是个国际化扩展,暂时用......
  • PHP7内核实现原理-基本架构
    发展史PHP最早是由Lerdorf于1995年,使用Perl语言,以PersonalHomePageTools(PHPTools)的形式创建的,目的是为了方便记录个人网站的访客记录和支持留言本等功能,此时称为PHP1。后来越来越多的网站开始使用PHP并希望能提供更多的功能,之后Lerdorf将PHP开源,此时称为......
  • springboot简单使用poi-tl
    简介poi-tl是一个基于ApachePOI的开源Word模板引擎,比Freemarker的功能更加强大。官方文档地址:http://deepoove.com/poi-tl/导包导入包时,依赖说明参考官方文档,导入包不适配可能会造成一些问题,此处可以使用<dependency><groupId>org.apache.poi</grou......
  • C++多线程编程:包括多线程打印ABC、线程池实现等等
    #include<iostream>#include<thread>#include<mutex>#include<condition_variable>std::condition_variablecond;std::mutexprint_mutex;intflag=0;voidprint_thread(intnum){for(inti=0;i<10;i++)//循环{......
  • WPF 使用Image实现动画旋转Loading
    首先需要有一个Loading的图片,(白色背景,白色小圆圈,所以显示看不到): 创建一个用户控件,实现动画的功能:<UserControlx:Class="K.Controls.Controls.LoadingImage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http:/......
  • 酒店预定的系统设计与实现-计算机毕业设计源码+LW文档
    随着计算机信息技术的发展,各种管理系统逐渐用在社会生产生活中,通过系统化管理提高办事流程,节约时间。在酒店,存在许多的服务内容,如客房预定、信息咨询、人员管理等等,这些复杂的业务信息单靠人工管理,费时费力,还容易出错。如果通过酒店管理系统进行系统化管理,可以有效的解决酒店的整个......