• poj_3468线段树成段更新求区间和


    #include<iostream>
    #include<string.h>
    #include<cstdio>
    long long num[100010];
    using namespace std;
    struct st
    {
        int l;
        int r;
        long long  sum;
        long long a;
    } p[400100];
    void build(int t,int l,int r)
    {
        p[t].l=l;
        p[t].r=r;
        if(l==r-1)
        {
            p[t].sum=num[l];
            return;
        }
        int mid=(l+r)/2;
        build(t*2+1,mid,r);
        build(t*2,l,mid);
        p[t].sum=p[t*2].sum+p[t*2+1].sum;
    }
    void update(int t,int l,int r,int v)
    {
        if(p[t].l==l&&p[t].r==r)
        {
            p[t].a += v;
    		p[t].sum += v*(r -l);
    		return ;
        }
        if( p[t].a )
    	{
    		p[2*t+1].a += p[t].a;
    		p[2*t].a += p[t].a;
    		p[2*t+1].sum += p[t].a*(p[2*t+1].r -p[2*t+1].l);
    		p[2*t].sum += p[t].a*(p[2*t].r -p[2*t].l);
    		p[t].a = 0;
    	}
    	int mid = (p[t].l+p[t].r)/2;
    	if( l >= mid )
    		update(2*t+1,l,r,v);
    	else
    		if( r <= mid )
    			update(2*t,l,r,v);
    		else
    		{
    			update(2*t,l,mid,v);
    			update(2*t+1,mid,r,v);
    		}
    	p[t].sum = p[2*t].sum + p[2*t+1].sum;
    }
    long long query(int t,int l,int r)
    {
    	if(p[t].l == l && p[t].r == r )
    		return p[t].sum;
    	if( p[t].a )
    	{
    		p[2*t+1].a += p[t].a;
    		p[2*t].a += p[t].a;
    		p[2*t+1].sum +=p[t].a*(p[2*t+1].r - p[2*t+1].l);
    		p[2*t].sum += p[t].a*(p[2*t].r - p[2*t].l);
    		p[t].a = 0;
    	}
    	int mid =(p[t].l+p[t].r)/2;
    	if( l >= mid )
    		return query(2*t+1,l,r);
    	else
    		if( r <= mid )
    			return query(2*t,l,r);
    		else
    			return query(2*t,l,mid) + query(2*t+1,mid,r);
    }
    int main()
    {
        int n,q;
        while(scanf("%d%d",&n,&q)!=EOF)
        {
            for(int i=0; i<n; i++)
                scanf("%lld",&num[i]);
            memset(p,0,sizeof(p));
            build(1,0,n+1);
            getchar();
            for(int i=0; i<q; i++)
            {
                char c;
                scanf("%c",&c);
                if(c=='Q')
                {
                    int x,y;
                    scanf("%d%d",&x,&y);
                    getchar();
                    printf("%lld
    ",query(1,x-1,y));
                }
                else if(c=='C')
                {
                    int x,y,z;
                    scanf("%d%d%d",&x,&y,&z);
                    getchar();
                    update(1,x-1,y,z);
                }
            }
    
        }
        return 0;
    }

  • 相关阅读:
    php内核为变量的值分配内存的几个宏
    php7 引用成为一种类型
    function参数
    execvp php-fpm reload使用的函数
    fastcgi
    php-fpm定时器
    php 类继承
    php 对象 调用静态方法
    php unset变量
    php5数组与php7数组区别
  • 原文地址:https://www.cnblogs.com/vactor/p/4100009.html
Copyright © 2020-2023  润新知