[POJ][3468][线段树] A Simple Problem with Integers

题目大意


你有n个整数,A1、A2、…、AN。你需要处理两种操作。

  • 将给定范围内的每个数字加上一个给定的值。
  • 求一个给定范围内的数字的总和。

思路


线段树成段增减的模板题。

代码


#include
#include
using namespace std;
#define MAXSIZE 100000
int total_edge,val[MAXSIZE+1];
struct node
{
    long long total;
    //区间属性,这里是total,表示区间元素和。 
    int left;
    int right;
    long long mark;
    //mark表示延迟标记 
}tree[MAXSIZE*3];
long long create(int root,int left,int right)
//以root为根节点建树。 
{
    tree[root].mark=0;
    tree[root].left=left;
    tree[root].right=right;
    if(left==right)
        return tree[root].total=val[left];
    int middle=(left+right)/2;
    return tree[root].total=create(2*root,left,middle)+create(2*root+1,middle+1,right);
}
void updata_mark(int root)
//更新root的子节点的延迟标记。 
{
    if(tree[root].mark)
    {
        tree[root].total+=tree[root].mark*(tree[root].right-tree[root].left+1);
        if(tree[root].left!=tree[root].right)
        {
            tree[root*2].mark+=tree[root].mark;
            tree[root*2+1].mark+=tree[root].mark;
        }
        tree[root].mark=0;
    }
}
long long calculate(int root,int left,int right)
//以root为根节点的线段树中,求取区间[left,right]的元素和。 
{
    updata_mark(root);
    if(tree[root].left>right||tree[root].rightright||tree[root].right	

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注