首页 > 其他分享 >洛谷题单指南-二叉堆与树状数组-P3368 【模板】树状数组 2

洛谷题单指南-二叉堆与树状数组-P3368 【模板】树状数组 2

时间:2024-11-18 11:29:00浏览次数:1  
标签:树状 int 洛谷题 cin add 数组 op

原题链接:https://www.luogu.com.cn/problem/P3368

题意解读:树状数组应用-区间修改,单点求值

解题思路:

设原数组为s[N],其差分数组为a[N]

操作一:区间修改

要对s[x] ~ s[y]每个数增加k,相当于对a[x]加k,对a[y + 1]减k,O(n)的操作变成了O(1)的操作,

利用树状数组tr[N]的add(x, k), add(y + 1, -k)来实现对于a[N]的操作即可.

操作二:单点求值

要求s[x]的值,相当于求a[1] ~ a[x]所有数的和,

利用树状数组的sum(x)求和即可。

树状数组初始化:

初始化时,要对原数组的值求差分,添加到树状数组。

100分代码:

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

const int N = 500005;
int n, m;
int s[N], tr[N];

int lowbit(int x)
{
    return x & -x;
}

void add(int x, int val)
{
    for(int i = x; i <= n; i += lowbit(i)) tr[i] += val;
}

int sum(int x)
{
    int res = 0;
    for(int i = x; i != 0; i -= lowbit(i)) res += tr[i];
    return res;
}

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        cin >> s[i];
        add(i, s[i] - s[i - 1]); //构造差分的树状数组
    }
    int op, x, y, k;
    while(m--)
    {
        cin >> op;
        if(op == 1)
        {
            cin >> x >> y >> k;
            add(x, k);
            add(y + 1, -k);
        }
        else if(op == 2)
        {
            cin >> x;
            cout << sum(x) << endl;
        }
    }
    return 0;
}

 

标签:树状,int,洛谷题,cin,add,数组,op
From: https://www.cnblogs.com/jcwy/p/18552239

相关文章

  • 洛谷题单指南-二叉堆与树状数组-P3374 【模板】树状数组 1
    原题链接:https://www.luogu.com.cn/problem/P3374题意解读:树状数组模版:单点修改,区间求值。解题思路:树状数组-BinaryIndexTree可以动态维护一组数,可以O(logn)的修改一个数,也可以O(logn)的计算一段区间的和。思考一下朴素做法:如何修改一个数,计算区间和?如果是常规数组,修改操作......
  • 动态规划 —— 子数组系列-最长湍流子数组
    1. 最长湍流子数组题目链接:978.最长湍流子数组-力扣(LeetCode)https://leetcode.cn/problems/longest-turbulent-subarray/description/ 2.题目解析假如有一个数组{a,b,c,d}如果在a这个位置,b比a大,呈上升趋势,c比b小,呈下降趋势,d比c大,呈上升趋势,像这种就是湍......
  • 最大子数组和
    最大子数组和题目给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。示例2:输入:nums=......
  • 数组
    下面有关数组的叙述中,只有()是正确的:A)虽然不能对数组进行整体的赋值和IO等,但可以将整个数组作为参数传递给函数,函数也可以返回整个数组!B)C要求形参和相对应的实参都必须是类型相同的数组。C)形参数组和实参数组为同一数组,共同拥有一段内存空间。D)C语言规定数组名就是数......
  • 941. 有效的山脉数组
    题目自己写的classSolution{public:boolvalidMountainArray(vector<int>&arr){intl=0,r=1;boolup=true,change=false;if(arr.size()<3)returnfalse;if(arr[r]<arr[l])......
  • 代码随想录:长度最小的子数组
    代码随想录:长度最小的子数组现在不像考研那时候,每天时间都是固定的,以后可能还是以周为单位定目标比较好一点滑动窗口问题,之后记得和计算机网络里的滑动窗口对比,并且和背包问题对比classSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){i......
  • STL之动态数组
    一、标准模板库(StandardTemplateLibrary,STL)是HP公司开发的一个C++模板库,包含一些常用的数据结构和算法。具有以下的组件:1.容器:容纳包含一组元素的对象。2.迭代器:提供访问容器的方法3.函数对象4.算法二、STL之向量——vector   vector是c++标准库提供的一个变长数......
  • 【C++笔记】一维数组元素处理
    目录1.插入元素方法代码2.删除元素方法代码3.交换元素方法代码1.插入元素方法概念:插入元素是指在数组的某个位置添加一个新元素,并将原来的元素向后移动。例如,将5插入到数组[1,2,4,6]的第二个位置,结果变为[1,5,2,4,6]。关键点:确定插入位置:首先要明......
  • 一文搞懂!数组作为函数输入如何声明?
    一维数组函数形参定义:voidarray_print(inta[])一维数组指针函数形参定义:voidarray_print(int*a)二维数组函数形参定义://必须指明数组的列数,数组的行数没有太大关系//因为函数调用时传递的是一个指针,它指向由行向量构成的一维数组//所以以下两种声明方式都可以......
  • (nice!!!)(LeetCode) 3240. 最少翻转次数使二进制矩阵回文 II (分类讨论、数组)
    题目:3240.最少翻转次数使二进制矩阵回文II思路:分类讨论,需要对行和列的个数进行讨论,时间复杂度为0(nm),细节看注释。C++版本:classSolution{public:intminFlips(vector<vector<int>>&grid){intans=0;intn=grid.size(),m=grid[0].size();......