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

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

    思路:这是一个区间改动区间查询的题,因为题目中的给的数据比較大,那么用单个改动和查询肯定不行,所以。

    。。。注意数据可能比較大,应该用__int64或long long存数据。

    。。

    code:

    #include<stdio.h>
    #include<math.h>
    #define L(u) (u<<1)
    #define R(u) (u<<1|1)
    
    const int M=100010;
    
    struct Node
    {
        __int64 l,r;
        __int64 add;
        long long sum;
    }node[M*4];
    
    __int64 a[M];
    
    void pushup(__int64 u)
    {
        node[u].sum=node[L(u)].sum+node[R(u)].sum;
        return ;
    }
    
    void pushdown(__int64 u)
    {
        node[L(u)].add+=node[u].add;
        node[L(u)].sum+=(node[L(u)].r-node[L(u)].l+1)*node[u].add;
        node[R(u)].add+=node[u].add;
        node[R(u)].sum+=(node[R(u)].r-node[R(u)].l+1)*node[u].add;
        node[u].add=0;
    }
    
    void build(__int64 u,__int64 left,__int64 right)
    {
        node[u].l=left;
        node[u].r=right;
        node[u].add=0;
        if(left==right)
        {
            node[u].sum=a[left];
            return ;
        }
        __int64 mid=(node[u].l+node[u].r)/2;
        build(L(u),left,mid);
        build(R(u),mid+1,right);
        pushup(u);
    
    }
    
    void update(__int64 u,__int64 left,__int64 right,__int64 v)
    {
        if(left<=node[u].l&&node[u].r<=right)
        {
            node[u].add+=v;
            node[u].sum+=(node[u].r-node[u].l+1)*v;
            return ;
        }
        //node[u].sum+=(right-left+1)*v;     //当前节点表示的区间不是查询区间的子区间
        if(node[u].add) pushdown(u);         //分析当前节点懒惰标记是否为0,不为0则要给他的子节点更新数据
        __int64 mid=(node[u].l+node[u].r)/2;
        if(right<=mid) update(L(u),left,right,v);
        else if(left>mid) update(R(u),left,right,v);
        else
        {
            update(L(u),left,mid,v);
            update(R(u),mid+1,right,v);
        }
        node[u].sum=node[L(u)].sum+node[R(u)].sum;
    }
    
    __int64 query(__int64 u,__int64 left,__int64 right)
    {
         if(left<=node[u].l&&node[u].r<=right)
        {
            return node[u].sum;
        }
        if(node[u].add) pushdown(u);          //分析当前节点懒惰标记是否为0,不为0则要给他的子节点更新数据
        __int64 mid=(node[u].l+node[u].r)/2;
        if(right<=mid) return query(L(u),left,right);
        else if(left>mid) return query(R(u),left,right);
        else
        {
            return (query(L(u),left,mid)+query(R(u),mid+1,right));
        }
    }
    
    int main()
    {
        __int64 n,m,i,x,y,z;
        while(scanf("%I64d%I64d",&n,&m)==2)
        {
            for(i=1;i<=n;i++)
            {
                scanf("%I64d",&a[i]);
            }
            build(1,1,n);
            char str[5];
            for(i=0;i<m;i++)
            {
                scanf("%s",str);
                if(str[0]=='C')
                {
                    scanf("%I64d%I64d%I64d",&x,&y,&z);
                    update(1,x,y,z);
                }
                else
                {
                    scanf("%I64d%I64d",&x,&y);
                    printf("%I64d
    ",query(1,x,y));
                }
            }
        }
        return 0;
    }
    


  • 相关阅读:
    CVE-2010-3333
    CVE-2010-2883
    谷歌不兼容showModalDialog()方法出现对话窗口解决方法
    asp.net中邮箱发送
    在c#中access2003和access2007连接字符串
    MVC连接Sql Server数据库出现的小问题
    使用360浏览器访问字体逆时针旋转90度的问题
    bootstrap与360浏览器不兼容问题
    委托的使用方法
    某集网将我的信息给了谁?还是不良卖家不想卖东西
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5154768.html
Copyright © 2011-2022 走看看