基础数据结构应用-一个简单的整数问题

目录

题目-一个简单的整数问题

问题分析

区间修改, 单点查询

但是树状数组只能支持单点修改, 单点查询

因此可以求出原序列的差分序列 , 假设原序列是 a 1 , a 2 , a 3 , . . . , a n a_1, a_2, a_3, ..., a_n a1,a2,a3,...,an

求出差分序列
b 1 , b 2 , b 3 , . . . , b n b_1, b_2, b_3, ..., b_n b1,b2,b3,...,bn
b 1 = a 1 − a 0 b_1 = a_1 - a_0 b1=a1−a0, b 2 = a 2 − a 1 b_2 = a_2 - a_1 b2=a2−a1...

差分序列的前缀和 就是原来位置的值

如果对原序列的一个区间 [ L , R ] [L, R] [L,R]进行增加 d d d, 那么就是差分序列 b L + d b_{L} + d bL+d, b R + 1 − d b_{R+ 1} - d bR+1−d

算法步骤

  • 求出原序列的差分序列
  • 构建树状数组
  • 区间修改转化为差分序列的单点修改
  • 查询原序列的 x x x位置的值, 相当于求差分序列的前缀和, 也就是树状数组的操作

算法时间复杂度 O ( M log ⁡ N ) O(M \log N) O(MlogN)

代码实现

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;

int n, m;
int a[N], b[N];
int tr[N];

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

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

int get(int u) {
    int ans = 0;
    for (int i = u; i; i -= lowbit(i)) ans += tr[i];
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        b[i] = a[i] - a[i - 1];
    }
    
    for (int i = 1; i <= n; ++i) modify(i, b[i]);

    while (m--) {
        char c;
        cin >> c;
        if (c == 'C') {
            int l, r, val;
            cin >> l >> r >> val;
            modify(l, val);
            modify(r + 1, -val);
        }
        else {
            int x;
            cin >> x;
            cout << get(x) << '\n';
        }
    }

    return 0;
}
相关推荐
懈尘4 分钟前
深入理解Java的HashMap扩容机制
java·开发语言·数据结构
We་ct8 分钟前
LeetCode 73. 矩阵置零:原地算法实现与优化解析
前端·算法·leetcode·矩阵·typescript
天赐学c语言8 分钟前
2.1 - 反转字符串中的单词 && 每个进程的内存里包含什么
c++·算法·leecode
程序员泠零澪回家种桔子11 分钟前
OpenManus开源自主规划智能体解析
人工智能·后端·算法
请注意这个女生叫小美13 分钟前
C语言 实例20 25
c语言·开发语言·算法
好学且牛逼的马14 分钟前
【Hot100|22-LeetCode 206. 反转链表 - 完整解法详解】
算法·leetcode·矩阵
hans汉斯16 分钟前
国产生成式人工智能解决物理问题能力研究——以“智谱AI”、“讯飞星火认知大模型”、“天工”、“360智脑”、“文心一言”为例
大数据·人工智能·算法·aigc·文心一言·汉斯出版社·天工
v_for_van20 分钟前
力扣刷题记录3(无算法背景,纯C语言)
c语言·算法·leetcode
ValhallaCoder23 分钟前
hot100-矩阵
数据结构·python·算法·矩阵
散峰而望24 分钟前
【基础算法】穷举的艺术:在可能性森林中寻找答案
开发语言·数据结构·c++·算法·随机森林·github·动态规划