J - A Simple Problem with Integers

来源:互联网 发布:ketchup mac 编辑:程序博客网 时间:2024/05/24 04:55

Description

给出了一个序列,你需要处理如下两种询问。

"C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。

"Q a b" 询问[a, b]区间中所有值的和。

Input

第一行包含两个整数N, Q。1 ≤ N,Q ≤ 100000.

第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤ 1000000000)。

接下来Q行询问,格式如题目描述。

Output

对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。

Sample Input

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

Sample Output

4559

15

题意:额。。。。。。中文题,聪明的游客,相信你肯定懂题意的,这你要是都读不懂我也没办法了,回家放牛吧。

解题思路:其实这题没什么思路,因为就是最简单的线段树区间更新再求和的问题,具体看代码注释

#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;#define MAXN 100010int a[MAXN];struct node{    int l,r;    long long int sum,sign;//sign用来记录更新区间需要处理的值,注意根据题意,用long long}tr[MAXN*4];void build(int id,int l,int r){    tr[id].l=l;    tr[id].r=r;    tr[id].sign=0;//初始化为0    if(l==r)        tr[id].sum=a[l];    else    {        int mid=(l+r)/2;        build(id*2,l,mid);        build(id*2+1,mid+1,r);        tr[id].sum=tr[id*2].sum+tr[id*2+1].sum;    }}void add(int id,int l,int r,long long int val){    if(l==tr[id].l&&tr[id].r==r)        tr[id].sign+=val;//条件满足就直接赋值    else    {        tr[id].sum+=val*(r-l+1);//注意这里要更新区间的和        int mid=(tr[id].l+tr[id].r)/2;        if(r<=mid)//全在左边            add(id*2,l,r,val);        else if (l>mid)//全在右边            add(id*2+1,l,r,val);        else//都有        {            add(id*2,l,mid,val);            add(id*2+1,mid+1,r,val);        }    }}long long int query(int id,int l,int r){    if(l==tr[id].l&&tr[id].r==r)        return tr[id].sum+(r-l+1)*tr[id].sign;    else    {        tr[id].sum+=(tr[id].r-tr[id].l+1)*tr[id].sign;        int mid=(tr[id].l+tr[id].r)/2;        add(id*2,tr[id].l,mid,tr[id].sign);//更新函数直接写在查询函数中,所以不需要判断,因为写这里表明肯定要向下更新        add(id*2+1,mid+1,tr[id].r,tr[id].sign);        tr[id].sign=0;        if(r<=mid)            return query(id*2,l,r);        else if(l>mid)            return query(id*2+1,l,r);        else            return query(id*2,l,mid)+query(id*2+1,mid+1,r);    }}int main(){    int m,n,i,x,y,z;    char ch[2];    scanf("%d%d",&n,&m);    for(i=1;i<=n;i++)        scanf("%d",&a[i]);    build(1,1,n);    while(m--)    {        scanf("%s",&ch);//注意这里,用%c的话,要加getchar()        if(ch[0]=='C')        {            scanf("%d%d%d",&x,&y,&z);            add(1,x,y,z);        }        else        {            scanf("%d%d",&x,&y);            cout<<query(1,x,y)<<endl;        }    }    return 0;}

0 0
原创粉丝点击