首页 > 编程语言 >c++ 线段树模板

c++ 线段树模板

时间:2023-10-15 09:57:49浏览次数:34  
标签:int 线段 mid long c++ 模板

洛谷模板:P3372 【线段树1】

 

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int a[N], d[N << 2], b[N << 2];
int n, q;
inline void build(int l, int r, int p) {
    if (l == r) {
        d[p] = a[l];    //叶子节点
        return ;
    }
    int mid = l + ((r - l) >> 1);
    build(l, mid, p << 1);  //左子树
    build(mid+1, r, (p << 1) | 1);  //右子树
    d[p] = d[p << 1] + d[(p << 1) | 1]; //深搜回溯记录
}
inline int getsum(int l, int r, int s, int t, int p) {   //区间查询
    if (l <= s && t <= r) {
        return d[p];        //如果区间[s,t]包含在[l,r]之中,返回区间和
    }
    int mid = s + ((t - s) >> 1);
    if (b[p]) {  //如果已经有懒惰标记
        d[p << 1] += b[p] * (mid - s + 1);  //标记下放
        d[(p << 1) | 1] += b[p] * (t - mid);
        b[p << 1] += b[p];      //把标记传给子节点
        b[(p << 1) | 1] += b[p];
        b[p] = 0;   //清空标记
    }
    int sum = 0;
    if (l <= mid) {
        sum = getsum(l, r, s, mid, p << 1);
    }
    if (r > mid) {
        sum += getsum(l, r, mid + 1, t, (p << 1) | 1);
    }
    return sum;
}
inline void update(int l, int r, int c, int s, int t, int p) {
    if (l <= s && t <= r) {
        d[p] += (t - s + 1) * c;
        b[p] += c;  //标记(lazy)
        return ;
    }
    int mid = s + ((t - s) >> 1);
    if (b[p]) {     //如果有标记
        d[p << 1] += b[p] * (mid - s + 1);  //标记下放
        d[(p << 1) | 1] += b[p] * (t - mid);
        b[p << 1] += b[p];      //把标记传给子节点
        b[(p << 1) | 1] += b[p];
        b[p] = 0;   //清空标记
    }
    if (l <= mid) {
        update(l, r, c, s, mid, p << 1);  //更新左节点
    }
    if (r > mid) {
        update(l, r, c, mid + 1, t, (p << 1) | 1);
    } d[p] = d[p << 1] + d[(p << 1) | 1];   //计算节点区间和
}
signed main() {
    scanf("%lld%lld", &n, &q);
    for (int i = 1;i <= n;i++) {
        scanf("%lld", &a[i]);
    }
    build(1, n, 1);
    while (q--) {
        int u, v, w;
        scanf("%lld%lld%lld", &u, &v, &w);
        if (u == 2) { 
            printf("%lld\n", getsum(v, w, 1, n, 1));
        } else {
            int o;
            scanf("%lld", &o);
            update(v, w, o, 1, n, 1);       //区间和
        }
    }
    return 0;
}

emm……自娱自乐,不太会写保存一下,刚学

标签:int,线段,mid,long,c++,模板
From: https://www.cnblogs.com/xiaoyuwan/p/17765282.html

相关文章

  • C++ const 在函数中的使用
    C++中的const在函数中的用法有三种:修饰形参此时写法如下:voidfun(constClassA&a);目的为防止传入的原始参数被修改;修饰返回值此时写法为constint&getAge();目的为防止函数返回值作为左值被修改;修饰函数此时的写法为typeNamefun()const();当const修饰函数时,所有......
  • stl(c++)
    1.vector定义: a.size()a.empty()a.clear()vector<int>::iteratorit=a.begin()迭代器(可类比于指针)前开后闭a.begin()a.end()是开始迭代器和最后一个元素的下一个迭代器a[0]=*a.begin()a.back()最后一个元素a.push_back()O(1)加入元素到末尾a.pop_back()删除最后一......
  • 一些 C/C++ 的知识
    引用https://zhuanlan.zhihu.com/p/100050970https://www.sohu.com/a/300755552_120111838gcc与g++的区别GCC:GNUCompilerCollection(GUN编译器集合),它可以编译C、C++、JAVA、Fortran、Pascal、Object-C等语言。gcc是GCC中的GUNCCompiler(C编译器);g++是GCC中的GUNC++Co......
  • (待完善)C/C++ Language Standard
    C89/C90(ANSICorISOC)wasthefirststandardizedversionofthelanguage,releasedin1989and1990,respectivelyC99(ISO/IEC9899:1999)C11(ISO/IEC9899:2011)C18(ISO/IEC9899:2018)ThefirstversionofCwascalled"ASystemProgrammingLang......
  • 使用c++语言基于QT框架设计的计算器小程序
    (注:由于从未接触软件设计,后端代码也是一塌糊涂,对于一些先进的设计软件也未曾接触,如qt,vs创建MFC文件,故本次作业最大难点在于如何将已经学习的知识和未接触过的领域结合起来。秉承程序员基本素养,利用一切可以利用的资源(感谢所有开源大佬所做的贡献),如bilibili,csdn,博客园,github,......
  • C++基本算法大致总结
    排序算法:快速排序(QuickSort):使用std::sort或自定义实现。归并排序(MergeSort):自定义实现或使用std::stable_sort。堆排序(HeapSort):自定义实现或使用std::make_heap和std::sort_heap。搜索算法:二分查找(BinarySearch):使用std::binary_search或自定义实现。线性......
  • 模板方法模式
      ......
  • Vue3| 模板引用、defineExpose宏函数
    模板引用的概念:通过ref标识获取真实的dom对象或者组件实例对象 使用:1.调用ref函数生成一个ref对象<script setup>import {ref} from 'vue'const h1Ref=ref(null)</script>2.通过ref标识绑定ref对象到标签<script setup>import {ref......
  • 【华为OD统一考试B卷 | 100分】 报数问题 (1到3报数)(C++ Java Python javaScript)
    华为OD在线刷题平台平台涵盖了华为OD机试A卷+B卷的真题。平台的题库不断更新,确保能够涵盖华为OD机试的所有真题。点击链接注册并开始你的刷题之旅:点击立即刷题华为OD统一考试A卷+B卷新题库说明2023年5月份,华为官方已经将的2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统......
  • 抽象工厂模式--C++实现
    具体代码实现#include<iostream>usingnamespacestd;classMan{public:virtualvoidshow()=0;};classWoman{public:virtualvoidshow()=0;};classYellowMan:publicMan{public:virtualvoidshow(){cout<<"......