首页 > 其他 > 详细

cogs 1316. 数列操作B 区间修改 单点查询

时间:2019-08-06 09:38:50      阅读:109      评论:0      收藏:0      [点我收藏+]

1316. 数列操作B

★★   输入文件:shulieb.in   输出文件:shulieb.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述】

假设有一个大小为 n(n100000) 整数数列 A,支持如下两种操作:

1. 将 Ai,Ai+1,,Aj 的值均增加 d

2. 查询 Ai 的值

根据操作要求进行正确操作并输出结果。

【输入格式】

输入文件第一行一个整数 n

第二行为 n 个整数,表示数列 A 中各项的初始值。

第三行为一个整数 m ,表示操作数。下接 m 行,每行描述一个操作,有如下两种情况:

ADD i j d(将 Ai,Ai+1,,Aj(1i,jn) 的值均增加一个整数 d

QUERY s(表示查询 As 的值)

【输出格式】

对于每一个询问,输出查询到的结果。

【样例输入】

4
1 4 2 3
3
QUERY 1
ADD 2 2 50
QUERY 2

【样例输出】

1
54


做法一:用树状数组存储差分数组
代码如下
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#define maxn 100005
using namespace std;
int n,m;
int a[maxn],sum[maxn];
int lowbit(int x){ return x&(-x); }
#define ll long long
void Add(int x,int d){//存的是差分数组 
    while(x<=n){sum[x]+=d;x+=lowbit(x); }
}
long long Sum(int x){
    long long ret=0;
    while(x>0){ ret+=sum[x];x-=lowbit(x);}
    return ret;
}
int main()
{
    freopen("shulieb.in","r",stdin);freopen("shulieb.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        string s;cin>>s;
        if(s[0]==Q){
            int x;scanf("%d",&x);
            printf("%lld\n",Sum(x)+a[x]);
        }
        else{
            int l,r,x;scanf("%d%d%d",&l,&r,&x);
            Add(l,x);Add(r+1,-x);
        }
            
    }
    
    return 0;
 } 

 



cogs 1316. 数列操作B 区间修改 单点查询

原文:https://www.cnblogs.com/Tidoblogs/p/11306966.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!