zoukankan      html  css  js  c++  java
  • POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)

    A Simple Problem with Integers
    Time Limit: 5000MS   Memory Limit: 131072K
    Total Submissions: 140120   Accepted: 43425
    Case Time Limit: 2000MS

    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.
    分析:
    线段树模板之区间增减更新 区间求和查询
    写板子好爽啊!!!
    code:
    #include<stdio.h>
    #include<iostream>
    #include<vector>
    #include <cstring>
    #include <stack>
    #include <cstdio>
    #include <cmath>
    #include <queue>
    #include <algorithm>
    #include <vector>
    #include <set>
    #include <map>
    #include<string>
    #include<math.h>
    #define max_v 100005
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    typedef long long LL;
    LL sum[max_v<<2],add[max_v<<2];
    struct node
    {
        int l,r;
        int mid()
        {
            return (l+r)/2;
        }
    }tree[max_v<<2];
    
    void push_up(int rt)//向上更新
    {
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    void push_down(int rt,int m)//向下更新
    {
        if(add[rt])//若有标记,则将标记向下移动一层
        {
            add[rt<<1]+=add[rt];
            add[rt<<1|1]+=add[rt];
    
            sum[rt<<1]+=add[rt]*(m-(m>>1));
            sum[rt<<1|1]+=add[rt]*(m>>1);
            add[rt]=0;//取消本层标记
        }
    }
    void build(int l,int r,int rt)
    {
        tree[rt].l=l;
        tree[rt].r=r;
        add[rt]=0;
    
        if(l==r)
        {
            scanf("%I64d",&sum[rt]);
            return ;
        }
    
        int m=tree[rt].mid();
        build(lson);
        build(rson);
        push_up(rt);//向上更新
    }
    void update(int c,int l,int r,int rt)
    {
        if(tree[rt].l==l&&tree[rt].r==r)
        {
            add[rt]+=c;
            sum[rt]+=(LL)c*(r-l+1);
            return ;
        }
    
        if(tree[rt].l==tree[rt].r)
            return ;
    
        push_down(rt,tree[rt].r-tree[rt].l+1);//向下更新
    
        int m=tree[rt].mid();
        if(r<=m)
            update(c,l,r,rt<<1);
        else if(l>m)
            update(c,l,r,rt<<1|1);
        else
        {
            update(c,l,m,rt<<1);
            update(c,m+1,r,rt<<1|1);
        }
        push_up(rt);//向上更新
    }
    LL getsum(int l,int r,int rt)
    {
        if(tree[rt].l==l&&tree[rt].r==r)
            return sum[rt];
    
        push_down(rt,tree[rt].r-tree[rt].l+1);//向下更新
    
        int m=tree[rt].mid();
        LL res=0;
        if(r<=m)
            res+=getsum(l,r,rt<<1);
        else if(l>m)
            res+=getsum(l,r,rt<<1|1);
        else
        {
            res+=getsum(l,m,rt<<1);
            res+=getsum(m+1,r,rt<<1|1);
        }
        return res;
    }
    int main()
    {
        int n,m;
        while(~scanf("%d %d",&n,&m))
        {
            build(1,n,1);//1到n建树 rt为1
    
            while(m--)
            {
                char str[5];
                int a,b,c;
                scanf("%s",str);
                if(str[0]=='Q')
                {
                    scanf("%d %d",&a,&b);
                    printf("%I64d
    ",getsum(a,b,1));
                }else
                {
                    scanf("%d %d %d",&a,&b,&c);
                    update(c,a,b,1);
                }
            }
        }
        return 0;
    }
    /*
    区间更新:增减更新
    区间查询:求和
    */
  • 相关阅读:
    suse12安装详解
    Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)
    菜鸟帮你跳过openstack配置过程中的坑[文末新添加福利]
    openstack中dashboard页面RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
    Multiple network matches found for name 'selfservice', use an ID to be more specific.报错
    查看 SELinux状态及关闭SELinux
    SELinux深入理解
    IP地址、子网掩码、网络号、主机号、网络地址、主机地址
    Oracle job procedure 存储过程定时任务
    POI文件导出至EXCEL,并弹出下载框
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9476344.html
Copyright © 2011-2022 走看看