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

AcWing 242. 一个简单的整数问题

给定长度为N的数列A,然后输入M行操作指令。

第一类指令形如“C l r d”,表示把数列中第l~r个数都加d。

第二类指令形如“Q X”,表示询问数列中第x个数的值。

对于每个询问,输出一个整数表示答案。

输入格式
第一行包含两个整数N和M。

第二行包含N个整数A[i]。

接下来M行表示M条指令,每条指令的格式如题目描述所示。

输出格式
对于每个询问,输出一个整数表示答案。

每个答案占一行。

数据范围
1≤N,M≤105,
|d|≤10000,
|A[i]|≤1000000000
输入样例:

10 5
1 2 3 4 5 6 7 8 9 10
Q 4
Q 1
Q 2
C 1 6 3
Q 2

输出样例:

4
1
2
5

这道题如同题目中所说是个简单的整数问题,让我们求的是一个数是多少,我们就用差分和树状数组来解决这一个问题,为什么要用树状数组呢,因为add与query操作很快。

代码如下:

#include<iostream>

using namespace std;

typedef long long LL;

const int N=1e5+10;

LL trie[N],a[N];
int n,m;

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

void add(int k,int v)
{
    
    
    for(int i=k;i<=n;i+=lowbit(i)) trie[i]+=v;
}

LL query(int k)
{
    
    
    LL res=0;
    for(int i=k;i;i-=lowbit(i))
    res+=trie[i];
    return res;
}

int main(void)
{
    
    
    cin>>n>>m;
    for(int i=1;i<=n;i++) 
    {
    
    
        cin>>a[i];
        add(i,a[i]-a[i-1]);
    }
    while(m--)
    {
    
    
        char op;
        cin>>op;
        if(op=='Q')
        {
    
    
            int t;
            cin>>t;
            cout<<query(t)<<endl;
        }
        else
        {
    
    
            int l,r,v;
            cin>>l>>r>>v;
            add(l,v);add(r+1,-v);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_52358098/article/details/114237052