zoukankan      html  css  js  c++  java
  • poj 3468 A Simple Problem with Integers

    题目连接:http://poj.org/problem?id=3468

    成断增加,注意的是求和可能超过32位,用__int64存储,成断更新的时候注意color为+-,而不是替换,有可能出现儿子的值还存在没有向下更新。。

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #define MAXN 100010
    __int64 color[MAXN<<2];
    __int64 tree[MAXN<<2];
    int n,num;
    void build_tree(int l,int r,int id);
    void push_up_tree(int id);
    __int64 query_tree(int left,int right,int l,int r,int id);
    void update_tree(int left,int right,int l,int r,int id,__int64 value);
    void push_down(int l,int r,int id);
    int main()
    {
        int i,left,right;
        __int64 value;
        char str[10];
        while(scanf("%d%d",&n,&num)==2)
        {
    
            build_tree(1,n,1);
            //printf("%I64d\n",tree[4]);
            for(i=1;i<=num;i++)
            {
                scanf("%s",str);
                if(str[0]=='Q')
                {
                    scanf("%d%d",&left,&right);
                   // printf("%s %d %d\n",str,left,right);
                    printf("%I64d\n",query_tree(left,right,1,n,1));
                }
                if(str[0]=='C')
                {
                    scanf("%d%d%I64d",&left,&right,&value);
                  update_tree(left,right,1,n,1,value);
                }
            }
    
        }
    
    }
    void build_tree(int l,int r,int id)
    {
        color[id]=0;
        if(l==r)
        {
            scanf("%I64d",&tree[id]);
            return ;
        }
        int mid=l+r>>1;
        build_tree(l,mid,id<<1);
        build_tree(mid+1,r,id<<1|1);
        push_up_tree(id);
    }
    void push_up_tree(int id)
    {
        tree[id]=tree[id<<1]+tree[id<<1|1];
    }
    __int64 query_tree(int left,int right,int l,int r,int id)
    {
        if(left<=l&&right>=r)
            return tree[id];
        push_down(l,r,id);
        int mid=l+r>>1;__int64 ret0=0;
        if(left<=mid)
            ret0+=query_tree(left,right,l,mid,id<<1);
        if(right>mid)
            ret0+=query_tree(left,right,mid+1,r,id<<1|1);
        return ret0;
    }
    void push_down(int l,int r,int id)
    {
        if(color[id])
        {
            int mid=l+r>>1;
            color[id<<1]+=color[id];
            color[id<<1|1]+=color[id];
            tree[id<<1]+=(mid-l+1)*color[id];
            tree[id<<1|1]+=(r-mid)*color[id];
            color[id]=0;
        }
    }
    void update_tree(int left,int right,int l,int r,int id, __int64 value)
    {
          if(left<=l&&right>=r)
          {
              color[id]+=value;
              tree[id]+=(r-l+1)*value;
              return ;
          }
          push_down(l,r,id);
          int mid=l+r>>1;
          if(left<=mid)
          {
             update_tree(left,right,l,mid,id<<1,value);
          }
          if(right>mid)
              update_tree(left,right,mid+1,r,id<<1|1,value);
          push_up_tree(id);
    
    }
  • 相关阅读:
    mysql中事务隔离级别可重复读说明
    Zookeeper安装与启动
    PHP闭包之bind和bindTo
    使用WebPack打包
    用Python下载momentum中的精美壁纸
    supervisor使用
    Shell脚本:RedisKey批量删除
    使用Certbot配置站点的https
    PHPfmt代码格式化
    创建用私钥签名的证书
  • 原文地址:https://www.cnblogs.com/woaiyy/p/2540631.html
Copyright © 2011-2022 走看看