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

   日期:2021-03-02     浏览:149    评论:0    
核心提示: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]|≤

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);
        }
    }
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服