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

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #define lson rt<<1,L,mid
    #define rson rt<<1|1,mid+1,R
    
    using namespace std;
    const int maxn=100005;
    int n,q;
    long long num[maxn];
    struct Node{
        long long sum,add;
        bool lazy;
    }tree[maxn<<2];
    
    void pushUp(int rt){
        tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
    }
    void pushDown(int rt,int m){
        if(tree[rt].lazy){
            tree[rt<<1].add+=tree[rt].add;
            tree[rt<<1|1].add+=tree[rt].add;
            tree[rt<<1].sum+=(m-m/2)*tree[rt].add;  //是加上父亲的add
            tree[rt<<1|1].sum+=m/2*tree[rt].add;
            tree[rt<<1].lazy=tree[rt<<1|1].lazy=true;
            tree[rt].add=0;
            tree[rt].lazy=false;
        }
    }
    void build(int rt,int L,int R){
        if(L==R){
            tree[rt].sum=num[L];
            tree[rt].add=0;
            tree[rt].lazy=false;
            return ;
        }
        int mid=(L+R)>>1;
        build(lson);
        build(rson);
        pushUp(rt);
    }
    
    void update(int rt,int L,int R,int l,int r,long long val){
        if(l<=L&&R<=r){
            tree[rt].sum+=(R-L+1)*val;
            tree[rt].add+=val;
            tree[rt].lazy=true;
            return;
        }
        pushDown(rt,R-L+1);
        int mid=(L+R)>>1;
        if(l<=mid)
            update(lson,l,r,val);
        if(r>mid)
            update(rson,l,r,val);
        pushUp(rt);
    }
    
    long long query(int rt,int L,int R,int l,int r){
        long long ret=0;
        if(l<=L&&R<=r){
            return tree[rt].sum;
        }
        pushDown(rt,R-L+1);  //额,好吧,忘记这里也要初始化了
        int mid=(L+R)>>1;
        if(l<=mid)
            ret+=query(lson,l,r);
        if(r>mid)
            ret+=query(rson,l,r);
        return ret;
    }
    int main()
    {
        int a,b;
        long long c; //c用int也能AC,用long long是防止当(R-L+1)*c的时候超出int范围
        char str[4];
        long long ans;
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++)
            scanf("%I64d",&num[i]);
        build(1,1,n);
        for(int i=1;i<=q;i++){
            scanf("%s",str);
            if(str[0]=='C'){
                scanf("%d%d%I64d",&a,&b,&c);
                update(1,1,n,a,b,c);
            }
            else{
                scanf("%d%d",&a,&b);
                ans=query(1,1,n,a,b);
                printf("%I64d
    ",ans);
            }
    
        }
        return 0;
    }
  • 相关阅读:
    requests模块
    unitest模块
    doctest模块
    SessionStorage
    jquery选择器
    jquery操作dom
    jquery事件
    jquery筛选
    页面跳转传值接收
    HTML5 Web SQL 数据库操作
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3413206.html
Copyright © 2011-2022 走看看