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

    题目大意:给一组数据,Q 为查询求a,b区间和,C为为区间a,b间的各个元素都加上c。

    题目思路:线段树模板

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<stdio.h>
    #include<queue>
    #include<math.h>
    #define INF 0x3f3f3f3f
    #define MAX 1000005
    #define Temp 1000000000
    
    using namespace std;
    
    long long a[MAX];
    
    struct node
    {
        int l,r,root;
        long long s,e;
    }tree[MAX];
    
    void MakeTree(int L,int R,int root)
    {
        tree[root].l=L;
        tree[root].r=R;
        tree[root].e=0;
    
        int Mid=(L+R)/2;
        if(L==R)
        {
            tree[root].s=a[L];
            return;
        }
    
        MakeTree(L,Mid,root*2);
        MakeTree(Mid+1,R,root*2+1);
    
        tree[root].s=tree[root*2].s+tree[root*2+1].s;
    }
    
    void Down(int root)
    {
        tree[root*2].s+=(tree[root*2].r - tree[root*2].l + 1)*tree[root].e;
        tree[root*2+1].s+=(tree[root*2+1].r - tree[root*2+1].l + 1)*tree[root].e;
    
        tree[root*2].e+=tree[root].e;
        tree[root*2+1].e+=tree[root].e;
    
        tree[root].e=0;
    }
    
    void UpDate(int L,int R,int date,int root)
    {
        tree[root].s+=(R-L+1)*date;
        int Mid=(tree[root].l + tree[root].r)/2;
        if(tree[root].l==L && tree[root].r==R)
        {
              return;
        }
        Down(root);
    
        if(R <= Mid)
            UpDate(L,R,date,root*2);
        else if(L > Mid)
            UpDate(L,R,date,root*2+1);
        else
        {
            UpDate(Mid+1,R,date,root*2+1);
            UpDate(L,Mid,date,root*2);
        }
    }
    
    long long Query(int L,int R,int root)
    {
        if(tree[root].l==L && tree[root].r==R)
        {
            return tree[root].s;
        }
    
        Down(root);
    
        int Mid=(tree[root].l + tree[root].r)/2;
    
        if(R <= Mid)
            return Query(L,R,root*2);
        else if(L > Mid)
            return Query(L,R,root*2+1);
        else
        {
            long long lsum=Query(L,Mid,root*2);
            long long rsum=Query(Mid+1,R,root*2+1);
            return lsum+rsum;
        }
    }
    
    int main()
    {
        int n,m,l,r,date;
        char op[2];
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%lld",&a[i]);
            }
            MakeTree(1,n,1);
            while(m--)
            {
                scanf("%s",op);
                if(op[0]=='Q')
                {
                    scanf("%d%d",&l,&r);
                    long long ans = Query(l,r,1);
                    printf("%lld
    ",ans);
                }
                else
                {
                    scanf("%d%d%d",&l,&r,&date);
                    UpDate(l,r,date,1);
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    java反射——字段
    java反射——方法
    java反射——构造方法
    代构建高可用分布式系统的利器——Netty
    JavaEE复习计划
    Java基础复习计划(三)
    Java基础复习计划(二)
    Java基础复习计划
    关于内网穿透的相关内容
    Docker化你的应用
  • 原文地址:https://www.cnblogs.com/alan-W/p/5899542.html
Copyright © 2011-2022 走看看