首页 > 编程语言 >线段树板子C++

线段树板子C++

时间:2023-02-20 15:25:59浏览次数:39  
标签:node lazy int 线段 C++ 板子 lson sum rson

    struct node
    {
        int l,r,sum,lazy;
        node *lson,*rson;
        node()
        {
            l = r = sum = lazy = 0;
            lson = rson = NULL;
        }
    };

    void update(node *k)
    {
        k->sum = 0;
        if(k->lson)
            k->sum += k->lson->sum;
        if(k->rson)
            k->sum += k->rson->sum;
    }

    //同范围加上一个相同的数
    void changeSegment(node *k,int l,int r,int x)
    {
        if(k->l==l && k->r==r)
        {
            k->sum += (r-l+1)*x;
            k->lazy += x;
            return;
        }

        int mid = (k->l+k->r)/2;
        if(r <= mid)
        {
            if(!k->lson)
            {
                k->lson = new node;
                k->lson->l = k->l;
                k->lson->r = mid;
            }

            changeSegment(k->lson,l,r);
        }
        else if(l > mid)
        {
            if(!k->rson)
            {
                k->rson = new node;
                k->rson->l = mid+1;
                k->rson->r = k->r;
            }

            changeSegment(k->rson,l,r);
        }

        update(k);
    }

    void changePoint(node *k,int x,int target)
    {
        if(k->l == k->r)
        {
            k->sum = target;
            return;
        }

        int mid = (k->l+k->r)/2;
        if(x <= mid)
        {
            if(!k->lson)
            {
                k->lson = new node;
                k->lson->l = k->l;
                k->lson->r = mid;
            }

            changePoint(k->lson,x,target);
        }
        else
        {
            if(!k->rson)
            {
                k->rson = new node;
                k->rson->l = mid+1;
                k->rson->r = k->r;
            }

            changePoint(k->rson,x,target);
        }

        update(k);
    }

    void pushdown(node *k)
    {
        if(k->l == k->r)
        {
            k->lazy = 0;
            return ;
        }

        if(k->lson)
        {
            k->lson->sum += (k->lson->r-k->lson->l+1)*k->lazy;
            k->lson->lazy += k->lazy;
        }
        if(k->rson)
        {
            k->rson->sum += (k->rson->r-k->rson->l+1)*k->lazy;
            k->rson->lazy += k->lazy;
        }

        k->lazy = 0;
    }

    int query(node *k,int l,int r)
    {
        if(k->lazy)
            pushdown(k);
            
        if(k->l==l && k->r==r)
            return k->sum;
        
        int mid = (k->l+k->r)/2;

        if(r <= mid)
            return query(k->lson,l,r);
        else if(l > mid)
            return query(k->rson,l,r);
        else
            return query(k->lson,l,mid)+query(k->rson,mid+1,r);
    }

    node *root = new node;

 

标签:node,lazy,int,线段,C++,板子,lson,sum,rson
From: https://www.cnblogs.com/cdp1591652208/p/17137520.html

相关文章

  • 从C到C++
    从C到C++(二)目录从C到C++(二)一、域运算符C++中新增作用域标识符:::二、new、delete运算符new运算符可以用于创建堆空间三、重载四、namemanagling与extern“C”五、带默认......
  • C、C++、python、java
    C++和Python的区别python是一种脚本语言,是解释执行的,而C++是编译语言,是需要编译后在特定平台运行的。python可以很方便的跨平台,但是效率没有C++高。Python使用缩进来区......
  • C/C++学生选课管理系统[2023-02-20]
    C/C++学生选课管理系统[2023-02-20]4.15学生选课管理系统题目描述:假定有n门课程,每门课程有课程编号,课程名称,课程性质(必须/选修),学时,授课学时,实验或上机学时,学分等信......
  • C++ primer 5th 第一章阅读笔记
    第一章开始第一节编写一个简单的C++程序不同编译器使用不同的后缀命名约定,比如cc、cpp、c。比如main程序保存到prog1.cc中,可以使用如下命令来编译它:ccprog1.cc。其中......
  • Carbon真的会替代C++吗
    个人认为Carbon并不是一个编程语言,而是一个已经被苹果公司弃用的macOS开发框架,曾经用于编写ClassicMacOS和早期版本的macOS应用程序。因此,Carbon并不能替代C++......
  • 【C/C++】知识点
    序链接备注1C语言0长度数组(可变数组/柔性数组)详解_CHENGJian的博客-CSDN博客_0数组 2     ......
  • C\C++ 埃氏筛法
     1埃氏筛法的基本思想:从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的。1#include<iostream>2usingnamespacestd;3constintmaxn=1000;4i......
  • c++常用关键字作用
    一、const关键字1.修饰C++类的成员函数修饰成员函数的时候,该函数则不能修改类内的成员变量,若是成员变量则编译器会报错。此处注意mutable关键字就是为了突破这个限制,如......
  • QML调用C++程序
    QML调用C++程序1.添加C++,MouseMemory文件(.h,.cpp)2.在main.cpp文件添加, qmlRegisterType<MouseMemory>("MouseMemory",1,0,"MouseMemory"); #第一个MouseMemory为C......
  • C++11环境安装【快速入门】
    第一步:安装编译器:https://winlibs.com/ 第二步:解压出来后 第三步:配置环境变量:bin目录 第四步:测试:gcc-v  第五步:关注作者微信公众号......