A Simple Problem with Integers 【线段树】

版权声明:反正没人看 随意转载 https://blog.csdn.net/qq_38930523/article/details/83543115

题目链接POJ-3468

[kuangbin带你飞]专题七 线段树

题目描述

You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

思路

区间修改,询问区间和。 典型的线段树板子题;
易错
1.需要用到lazy标记
2.数据范围可能会爆int, 数据类型开 long long

代码

#include <iostream>
using namespace std;

#define MAX 100010

struct Node{
    long long l, r;
    long long sum, lazy;
    void updata(long long val)
    {
        sum += (r - l + 1) * val;
        lazy += val;
    }     
}tree[MAX * 4];

void push_up(int k)
{
    tree[k].sum = tree[k<<1].sum + tree[k<<1|1].sum;
}

void push_down(int k)
{
    long long lazyval = tree[k].lazy;
    if(lazyval)
    {
        tree[k<<1].updata(lazyval);
        tree[k<<1|1].updata(lazyval);
        tree[k].lazy = 0;
    }
}

void build(int k, int l, int r)
{
    tree[k].l = l, tree[k].r = r;
    tree[k].sum = tree[k].lazy = 0;
    if(l == r)
    {
        cin >> tree[k].sum;
    }
    else
    {
        int mid = (l + r) >> 1;
        build(k<<1, l, mid);
        build(k<<1|1, mid+1, r);
        push_up(k);
    }
}

void updata(int k, int l, int r, long long val)
{
    int L = tree[k].l, R = tree[k].r;
    if(l <= L && R <= r)
    {
        tree[k].updata(val);
    }
    else
    {
        push_down(k);
        int mid = (L + R) >> 1;
        if(l <= mid)
            updata(k<<1, l, r, val);
        if(mid < r)
            updata(k<<1|1, l, r, val);
        push_up(k);
    }
}

long long query(int k, int l, int r)
{
    int L = tree[k].l, R = tree[k].r;
    if(l <= L && R <= r)
    {
        return tree[k].sum;
    }
    else
    {
        long long tmp = 0;
        push_down(k);
        int mid = (L + R) >> 1;
        if(l <= mid)
            tmp += query(k<<1, l, r);
        if(mid < r)
            tmp += query(k<<1|1, l, r);
        push_up(k);
        return tmp;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    while(cin >> n >> m)
    {
        build(1, 1, n);
        for(int i = 1; i<=m; i++)
        {
            string s;
            cin >> s;
            if(s == "Q")
            {
                int x, y;
                cin >> x >> y;
                cout << query(1, x, y) << endl;
            }
            else
            {
                long long x, y, val;
                cin >> x >> y >> val;
                updata(1, x, y, val);
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38930523/article/details/83543115