• poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和


    A Simple Problem with Integers

    Time Limit: 1 Sec  Memory Limit: 256 MB

    题目连接

    http://poj.org/problem?id=3468

    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

    题意

     区间加,区间查询和

    题解:

    线段树,记住懒操作~

    代码:

    //qscqesze
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define maxn 200001
    #define mod 10007
    #define eps 1e-9
    int Num;
    char CH[20];
    //const int inf=0x7fffffff;   //нчоч╢С
    const int inf=0x3f3f3f3f;
    /*
    
    inline void P(int x)
    {
        Num=0;if(!x){putchar('0');puts("");return;}
        while(x>0)CH[++Num]=x%10,x/=10;
        while(Num)putchar(CH[Num--]+48);
        puts("");
    }
    */
    //**************************************************************************************
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline void P(int x)
    {
        Num=0;if(!x){putchar('0');puts("");return;}
        while(x>0)CH[++Num]=x%10,x/=10;
        while(Num)putchar(CH[Num--]+48);
        puts("");
    }
    struct node
    {
        int l,r;
        ll sum,add;
        void fun(ll tmp)
        {
            add+=tmp;
            sum+=(r-l+1)*tmp;
        }
    }a[maxn*4];
    ll d[maxn];
    void relax(int x)
    {
        if(a[x].add)
        {
            a[x<<1].fun(a[x].add);
            a[x<<1|1].fun(a[x].add);
            a[x].add=0;
        }
    }
    void build(int x,int l,int r)
    {
        a[x].l=l,a[x].r=r;
        if(l==r)
        {
            a[x].sum=d[l];
        }
        else
        {
            int mid=(l+r)>>1;
            build(x<<1,l,mid);
            build(x<<1|1,mid+1,r);
            a[x].sum=a[x<<1].sum+a[x<<1|1].sum;
        }
    }
    void update(int x,int st,int ed,ll c)
    {
        int l=a[x].l,r=a[x].r;
        if(st<=l&&r<=ed)
            a[x].fun(c);
        else
        {
            relax(x);
            int mid=(l+r)>>1;
            if(st<=mid)update(x<<1,st,ed,c);
            if(ed>mid) update(x<<1|1,st,ed,c);
            a[x].sum=a[x<<1].sum+a[x<<1|1].sum;
        }
    }
    ll query(int x,int st,int ed)
    {
        int l=a[x].l,r=a[x].r;
        if(st<=l&&r<=ed)
            return a[x].sum;
        else
        {
            relax(x);
            int mid=(l+r)>>1;
            ll sum1=0,sum2=0;
            if(st<=mid)
                sum1=query(x<<1,st,ed);
            if(ed>mid)
                sum2=query(x<<1|1,st,ed);
            return sum1+sum2;
        }
    }
    int main()
    {
        int n=read(),m=read();
        for(int i=1;i<=n;i++)
            d[i]=read();
        build(1,1,n);
        char s[3];
        int bb,cc,dd;
        for(int i=0;i<m;i++)
        {
            scanf("%s",s);
            if(s[0]=='Q')
            {
                bb=read(),cc=read();
                printf("%lld
    ",query(1,bb,cc));
            }
            else
            {
                bb=read(),cc=read(),dd=read();
                update(1,bb,cc,dd);
            }
        }
    }
  • 相关阅读:
    java用户角色权限设计
    六种方式实现hibernate查询,及IDE推荐
    SSH远程会话管理工具
    Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置
    Linux 下JDK安装
    linux下FTP的工具和使用以及rpmReadSignature failed错误
    不用FTP使用SecureCRT上传下载文件,并解决rz、sz command not found异常
    hibernate通过数据库表反向生成实体类
    解决vmware 桥联 再次使用联不上网的问题
    log4j详解与实战
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4447564.html
Copyright © 2020-2023  润新知