zoukankan      html  css  js  c++  java
  • POJ3468(A Simple Problem with Integers)

    维持一个整数序列,支持2种操作:

    Q a b:查询区间[a,b]内的和;

    C a b x:将区间[a,b]内的每个数加上x。

    对于每次查询输出结果。

    结果可能会超32位。

    View Code
    #include <stdio.h>
    #define N 100001
    int n,m,a[N];
    long long ans;
    long long sum[4*N],inc[4*N];
    void update(int cur)
    {
        int ls=cur<<1,rs=cur<<1|1;
        sum[cur]=sum[ls]+sum[rs];
    }
    void pushdown(int cur,int x,int y)
    {
        int mid=(x+y)>>1,ls=cur<<1,rs=cur<<1|1;
        if(inc[cur])
        {
            sum[ls]+=inc[cur]*(mid-x+1);
            sum[rs]+=inc[cur]*(y-mid);
            inc[ls]+=inc[cur];
            inc[rs]+=inc[cur];
            inc[cur]=0;
        }
    }
    void build(int cur,int x,int y)
    {
        int mid=(x+y)>>1,ls=cur<<1,rs=cur<<1|1;
        inc[cur]=0;
        if(x==y)
        {
            sum[cur]=a[x];
            return;
        }
        build(ls,x,mid);
        build(rs,mid+1,y);
        update(cur);
    }
    void change(int cur,int x,int y,int s,int t,int v)
    {
        int mid=(x+y)>>1,ls=cur<<1,rs=cur<<1|1;
        if(x>=s && y<=t)
        {
            sum[cur]+=v*(y-x+1);
            inc[cur]+=v;
            return;
        }
        pushdown(cur,x,y);
        if(mid>=s)  change(ls,x,mid,s,t,v);
        if(mid+1<=t)    change(rs,mid+1,y,s,t,v);
        update(cur);
    }
    void query(int cur,int x,int y,int s,int t)
    {
        int mid=(x+y)>>1,ls=cur<<1,rs=cur<<1|1;
        if(x>=s && y<=t)
        {
            ans+=sum[cur];
            return;
        }
        pushdown(cur,x,y);
        if(mid>=s)  query(ls,x,mid,s,t);
        if(mid+1<=t)    query(rs,mid+1,y,s,t);
    }
    int main()
    {
        int i,x,y,z;
        char c;
        while(~scanf("%d%d",&n,&m))
        {
            for(i=1;i<=n;i++)   scanf("%d",&a[i]);
            build(1,1,n);
            for(i=0;i<m;i++)
            {
                c=0;
                while(c!='Q' && c!='C') scanf("%c",&c);
                scanf("%d%d",&x,&y);
                if(c=='Q')
                {
                    ans=0;
                    query(1,1,n,x,y);
                    printf("%lld\n",ans);
                }
                else
                {
                    scanf("%d",&z);
                    change(1,1,n,x,y,z);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    自定义Listview
    android ListView嵌套GridView显示不全问题
    Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
    android service被系统回收的解决方法
    android Activity基类通用方法
    用 FragmentManager 替换时使用 GoogleMaps 崩溃 app
    Gulp 从0开始
    面试题 之 全排列
    面试题之 query转为obj
    this .运算符 和 [] 运算符
  • 原文地址:https://www.cnblogs.com/algorithms/p/2587928.html
Copyright © 2011-2022 走看看