首页 > 其他分享 >线段树模板(区间修改,区间查询)

线段树模板(区间修改,区间查询)

时间:2022-10-13 20:55:29浏览次数:69  
标签:int 线段 tr ans 区间 sum 模板 op

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;

int n, m;
int w[N];
struct node {
    int l, r;
    LL sum, add;
}tr[N * 4];

void pushup(int u) {
    tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}

void pushdown(int u) {
    auto &root = tr[u], &left = tr[u << 1], &right = tr[u << 1 | 1];
    if (root.add) {
        left.add += root.add, left.sum += (LL)(left.r - left.l + 1) * root.add;
        right.add += root.add, right.sum += (LL)(right.r - right.l + 1) * root.add;
        root.add = 0;
    }
}

void build(int u, int l, int r) {
    if (l == r) tr[u] = {l, r, w[l], 0};
    else {
        tr[u] = {l, r};//不要忘
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        pushup(u);//pushup
    }
}

void modify(int u, int l, int r, int x) {
    if (tr[u].l >= l && tr[u].r <= r) {
        tr[u].sum += (LL)(tr[u].r - tr[u].l + 1) * x;
        tr[u].add += x;
    }
    else {
        pushdown(u);//modify之间要pushdown
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid) modify(u << 1, l, r, x);
        if (r > mid) modify(u << 1 | 1, l, r, x);
        pushup(u);//注意pushup
    }
}

LL query(int u, int l, int r) {
    if (tr[u].l >= l && tr[u].r <= r) return tr[u].sum;

    pushdown(u);
    int mid = tr[u].l + tr[u].r >> 1;
    LL ans = 0;
    if (l <= mid) ans = query(u << 1, l, r);
    if (r > mid) ans += query(u << 1 | 1, l, r);
    return ans;
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) cin >> w[i];

    build(1, 1, n);

    while (m --) {
        char op; cin >> op;
        int l, r, x;
        cin >> l >> r;

        if (op == 'Q') cout << query(1, l, r) << endl;
        else {
            cin >> x;
            modify(1, l, r, x);
        }
    }
    return 0;
}

 

标签:int,线段,tr,ans,区间,sum,模板,op
From: https://www.cnblogs.com/Leocsse/p/16789621.html

相关文章

  • 【模板】最长公共子序列
    【模板】最长公共子序列题目描述给出$1,2,\ldots,n$的两个排列$P_1$和$P_2$,求它们的最长公共子序列。输入格式第一行是一个数$n$。接下来两行,每行为$n$个数,......
  • 类模板补充(静态数据成员)
     类模板使用总结 ......
  • 李超线段树
    \(LiChao-Tree\)简称LCT维护一些与斜率相关的东西,一次函数等等\(calc(a,pos):\)用来计算\(y=k_a\timesx+b_a\),其中横坐标\(x=pos\)inlinedbcalc(intx,int......
  • 微信小游戏开放数据域模板覆盖问题
    每次构建发布时,会发现原本微信小程序里调整好的排行榜样式,我在cocos里构建完之后,微信小游戏调整好的样式无了!又变成以前的然后研究发现我们需要将改好后的工程build文......
  • 权值线段树
    一.权值线段树权值线段树即一种线段树,以序列的数值为下标。节点里所统计的值为节点所对应的区间[l,r]中,[l,r]这个值域中所有数的出现次数。举个例子,有一个长度为10......
  • 类模板和友元函数
    一般来说,能不用友元就不用友元。友元函数并不是类的内部函数,因此写法颇有规则:   ......
  • java根据模板excel导出pdf和excel (easypoi)示例
    /***下载带模板的excel*@paramresponse*@parammap数据mapkey需与模板中对应*@paramtemplateUrl模板excel路径*@param......
  • 模板全特化与偏特化的概念
    前言之前我在学习STL的时候,发现STL用到了大量的类模板、函数模板。对于模板而言,我们知道,当用户传递类型后,模板会进行自动类型推演,但是作为一个模板初学者,我有时候并不能确......
  • 基于STM32H7,F407,F429的ThreadX内核程序模板,含GCC,MDK和IAR三个版本(2020-06-08)
    V5是STM32F407IGT6,V6是STM32F429BIT6,V7是STM32H743XIH6模板下载:​​V5-2000_ThreadX内核模板(支持MDK,IAR和GCC).rar​​(3.45MB)​​V6-2000_ThreadX内核模板(支持MDK,IAR和GCC......
  • SSM框架各配置文件模板
    SpringMVC配置文件springmvc-config.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="htt......