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: 44944        Accepted: 13169
    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.
    Source
    
    POJ Monthly--2007.11.25, Yang Yi
    
    
    题意:略
    
    */
    /*
    本题我做的时候出了点差错,后来看了大神的才知道
    */
    #include <iostream>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    using namespace std;
    #define lson l , m , rt << 1
    #define rson m + 1 , r , rt << 1 | 1
    #define LL long long
    const int maxn = 111111;
    LL add[maxn<<2];//不用长整型wa
    LL sum[maxn<<2];
    void PushUp(int rt)
    {
        sum[rt] = sum[rt<<1] + sum[rt<<1|1];
    }
    void PushDown(int rt,int m)
    {
        if (add[rt])
        {
            add[rt<<1]+= add[rt];//和乘法(赋相同的值)的区别,乘法是直接赋值
            add[rt<<1|1]+=add[rt];//和乘法(赋相同的值)的区别,乘法是直接赋值
            sum[rt<<1] +=(m-(m>>1))*add[rt];//长度和 (l+r)/2-l一样即(r-l+1)-(r-l+1)/2==(l+r)/2-l
            sum[rt<<1|1] += (m>>1)*add[rt];
            add[rt] = 0;
        }
    }
    void cre(int l,int r,int rt)
    {
        add[rt]=0;
        if(l==r)
        {
            scanf("%lld",&sum[rt]);
            return;
        }
    
        int m= (l+r)>>1;
        cre(lson);
        cre(rson);
        PushUp(rt);
    }
    void upd(int L,int R,int c,int l,int r,int rt)
    {
       // printf("前面  L = %d R = %d l = %d r = %d rt = %d
    ",L,R,l,r,rt);
        if(L<=l&&r<=R)
        {
            add[rt]+=c;//和乘法(赋相同的值)的区别,乘法是直接赋值
            sum[rt]+=(LL)c*(r-l+1);
    
           // printf("L = %d R = %d l = %d r = %d rt = %d sum[%d] = %d
    ",L,R,l,r,rt,rt,sum[rt]);
            return ;
        }
        PushDown(rt,r-l+1);
        int m =(l+r)>>1;
        if(L<=m)
            upd(L,R,c,lson);
        if(R>m)
            upd(L,R,c,rson);
        PushUp(rt);
    }
    LL qur(int L,int R,int l,int r,int rt)
    {
       // printf("L = %d R = %d l = %d r = %d rt = %d
    ",L,R,l,r,rt);
       // system("pause");
        if(L<=l&&r<=R)
        {
            return sum[rt];
        }
        PushDown(rt,r-l+1);
        int m =(l+r)>>1;
        LL ret=0;
        if(L<=m)
        {
            ret+=qur(L,R,lson);
            //printf("ret = %d
    ",ret);
        }
    
        if(R>m)
        {
    
            ret+=qur(L,R,rson);
           // printf("ret = %d
    ",ret);
        }
    
    
        return ret;
    }
    int main()
    {
        int N,Q,a,b,c,i;
        char ch[2];
        while(~scanf("%d %d",&N,&Q))
        {
            cre(1,N,1);
            for(i=1; i<=Q; i++)
            {
                scanf("%s",ch);
                if(ch[0]=='Q')
                {
                    scanf("%d%d",&a,&b);
                    printf("%lld
    ",qur(a,b,1,N,1));
                }
                else if(ch[0]=='C')
                {
                    scanf("%d%d%d",&a,&b,&c);
                    upd(a,b,c,1,N,1);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    Mysql登录错误:ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded
    Docker配置LNMP环境
    Docker安装mysqli扩展和gd扩展
    Docker常用命令
    Ubuntu常用命令
    单例模式的优缺点和使用场景
    ABP 多租户数据共享
    ABP Core 后台Angular+Ng-Zorro 图片上传
    ERROR Error: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as 'standalone' in ngModelOptions.
    AbpCore 执行迁移文件生成数据库报错 Could not find root folder of the web project!
  • 原文地址:https://www.cnblogs.com/heqinghui/p/3199110.html
Copyright © 2011-2022 走看看