BZOJ-3212 Pku3468 A Simple Problem with Integers 裸线段树区间维护查询

来源:互联网 发布:金蝶会计软件 编辑:程序博客网 时间:2024/06/01 09:12

3212: Pku3468 A Simple Problem with Integers
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 1278 Solved: 560
[Submit][Status][Discuss]

Description
You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, … , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
“C a b c” means adding c to each of Aa, Aa+1, … , Ab. -10000 ≤ c ≤ 10000.
“Q a b” means querying the sum of Aa, Aa+1, … , Ab.

Output
You need to answer all Q commands in order. One answer in a line.

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

Sample Output
4
55
9
15

HINT
The sums may exceed the range of 32-bit integers.

题目大意:区间修改和区间查询

裸线段树毫无爆点

代码如下:

/**************************************************************    Problem: 3212    User: DaD3zZ    Language: C++    Result: Accepted    Time:48 ms    Memory:8304 kb****************************************************************/#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 100001long long sum[maxn<<2]={0},delta[maxn<<2]={0};long long a[maxn]={0};void updata(int now){    sum[now]=sum[now<<1]+sum[now<<1|1];}void build(int now,int l,int r){    if (l==r)        {            sum[now]=a[l];            return;        }    int mid=(l+r)>>1;    build(now<<1,l,mid);    build(now<<1|1,mid+1,r);    updata(now);}void pushdown(int now,int ln,int rn){    if (delta[now]!=0)        {            delta[now<<1]+=delta[now];            delta[now<<1|1]+=delta[now];            sum[now<<1]+=delta[now]*ln;            sum[now<<1|1]+=delta[now]*rn;            delta[now]=0;        }}void change(int L,int R,int now,int l,int r,long long data){    if (L<=l && R>=r)        {            sum[now]+=data*(r-l+1);            delta[now]+=data;            return;        }    int mid=(l+r)>>1;    pushdown(now,mid-l+1,r-mid);//这里需要先下放一波标记不然会出错    if (L<=mid)        change(L,R,now<<1,l,mid,data);    if (R>mid)        change(L,R,now<<1|1,mid+1,r,data);    updata(now);}long long query(int L,int R,int now,int l,int r){    if (L<=l && R>=r)        return sum[now];    int mid=(l+r)>>1;    pushdown(now,mid-l+1,r-mid);    long long total=0;    if (L<=mid)        total+=query(L,R,now<<1,l,mid);    if (R>mid)        total+=query(L,R,now<<1|1,mid+1,r);    return total;}int main(){    int n,m;    scanf("%d%d",&n,&m);    for (int i=1; i<=n; i++)        scanf("%lld",&a[i]);    build(1,1,n);    for (int i=1; i<=m; i++)        {            char c[3];            int l,r;            scanf("%s",&c);            scanf("%d%d",&l,&r);            if (c[0]=='Q')                {                    long long ans=query(l,r,1,1,n);                    printf("%lld\n",ans);                }            else                {                    long long data;                    scanf("%lld",&data);                    change(l,r,1,1,n,data);                }        }    return 0;   }
0 0
原创粉丝点击