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


    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 100001
    long 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
    ",ans);
                    }
                else
                    {
                        long long data;
                        scanf("%lld",&data);
                        change(l,r,1,1,n,data);
                    }
            }
        return 0;   
    }
  • 相关阅读:
    Linux systemd & init.d
    windows 气泡提示
    C++17新特性
    Lua & C++
    C++智能指针原理
    C++ Memory Order
    析命令提示符的原理
    设置与获取系统代理信息
    命令查看系统信息
    Linux shell脚本
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346242.html
Copyright © 2020-2023  润新知