AcWing 242. 一个简单的整数问题(树状数组+差分)

题目链接:点击这里
在这里插入图片描述
在这里插入图片描述
将树状数组初始化一维差分数组,每次区间修改的“影响”在 l l 处产生,在 r + 1 r+1 处消除,查询某个值就是求查分数组的前缀和。

该做法巧妙地把“区间增加”+“单点查询”变为树状数组擅长的“单点增加”+“区间查询”进行处理。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
typedef long long ll;
const int N = 100010;

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

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

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

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

int main()
{
    scanf("%d%d", &n, &m);
    
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    
    for(int i = 1; i <= n; ++i) add(i, a[i] - a[i - 1]);
    
    while(m--)
    {
        char op[2];
        scanf("%s", op);
        
        if(op[0] == 'Q')
        {
            int x;
            scanf("%d", &x);
            printf("%lld\n", sum(x));
        }
        else
        {
            int l, r, d;
            scanf("%d%d%d", &l, &r, &d);
            add(l, d);
            add(r + 1, -d);
        }
    }
    
    return 0;
}
发布了844 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/105170244