线段树(模板题)

codevs1080
单点增加与区间询问

#include<iostream>
#include<string>
#include<stdio.h>
#include<math.h>
using namespace std;
typedef long long ll;
int num[100005];
int ans = 0;
int x, y;
struct node {
    int l, r, w;
}tree[400021];
void build(int l, int r, int k)
{
    tree[k].l = l;
    tree[k].r = r;
    if (l == r)
    {
        cin >> num[l];
        tree[k].w = num[l];
        return;
    }
    int m = (l + r) / 2;
    build(l, m, k * 2);
    build(m + 1, r, k * 2 + 1);
    tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}

void add(int k, int x, int A)
{
    if (tree[k].l == tree[k].r)
    {
        tree[k].w += A;
        return;
    }
    int m = (tree[k].r + tree[k].l) / 2;
    if (x <= m)add(k * 2, x, A);
    else add(2 * k + 1, x, A);
    tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}

void sum(int k)
{
    if (tree[k].l >= x && tree[k].r <= y)
    {
        ans += tree[k].w;
        return ;
    }
    int m = (tree[k].l + tree[k].r) / 2;
    if (x <= m)sum(k * 2);
    if (y > m)sum(k * 2 + 1);
}

int main()
{
    int n, m, i;
    cin >> n;
    build(1, n, 1);
    /*
    for (i = 1; i<16; i++)
    {
        cout <<i<<" "<< tree[i].r << " " << tree[i].r << " " << tree[i].w << endl;
    }
    */
    cin >> m;
    while (m--)
    {   
        ans = 0;
        int op, A, l, r, index;
        cin >> op;
        if(op==1)
        {
            cin >> index >> A;
            add(1,index,A);
            /*
            for (i = 1; i<16; i++)
            {
            cout <<i<<" "<< tree[i].r << " " << tree[i].r << " " << tree[i].w << endl;
            }
            */
        }
        else if(op==2)
        {
            cin >> x >> y;
            sum(1);
            cout << ans << endl;
        }
    }   
    system("pause");
    return 0;
}

codevs1081
区间增加和单点询问

#include<iostream>
#include<string>
#include<stdio.h>
#include<math.h>
using namespace std;
typedef long long ll;
int num[400021];
int ans = 0;
int x, y, A;
struct node {
    int l, r, w;
}tree[400021];
void build(int l, int r, int k)
{
    tree[k].l = l;
    tree[k].r = r;
    if (l == r)
    {
        cin >> num[l];
        tree[k].w = num[l];
        return;
    }
    int m = (l + r) / 2;
    build(l, m, k * 2);
    build(m + 1, r, k * 2 + 1);
    tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}

void add(int k, int x, int A)
{
    if (tree[k].l == tree[k].r)
    {
        tree[k].w += A;
        return;
    }
    int m = (tree[k].r + tree[k].l) / 2;
    if (x <= m)add(k * 2, x, A);
    else add(2 * k + 1, x, A);
    tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}

void ask(int k)
{
    if (tree[k].l == tree[k].r)
    {
        ans = tree[k].w;
        return;
    }
    int m = (tree[k].l + tree[k].r) / 2;
    if (x <= m)ask(k * 2);
    else ask(k * 2 + 1);
}

void sum(int k)
{
    if (tree[k].l >= x && tree[k].r <= y)
    {
        ans += tree[k].w;
        return ;
    }
    int m = (tree[k].l + tree[k].r) / 2;
    if (x <= m)sum(k * 2);
    if (y > m)sum(k * 2 + 1);
}

int main()
{
    int n, Q, op, i;
    cin >> n;
    build(1, n, 1);
    cin >> Q;
    while (Q--)
    {
        cin >> op;
        if (op == 1)
        {
            cin >> x >> y >> A;
            for (i = x; i <= y; i++)
            {
                add(1, i, A);
            }
        }
        if (op == 2)
        {
            cin >> x;
            ask(1);
            cout << ans << endl;
        }
    }
    system("pause");
    return 0;
}

codevs1082
区间增加和区间询问

#include<iostream>
#include<string>
#include<stdio.h>
#include<math.h>
using namespace std;
typedef long long ll;
int num[400021];
int ans = 0;
int x, y, A;
struct node {
    int l, r, w;
}tree[400021];
void build(int l, int r, int k)
{
    tree[k].l = l;
    tree[k].r = r;
    if (l == r)
    {
        cin >> num[l];
        tree[k].w = num[l];
        return;
    }
    int m = (l + r) / 2;
    build(l, m, k * 2);
    build(m + 1, r, k * 2 + 1);
    tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}

void add(int k, int x, int A)
{
    if (tree[k].l == tree[k].r)
    {
        tree[k].w += A;
        return;
    }
    int m = (tree[k].r + tree[k].l) / 2;
    if (x <= m)add(k * 2, x, A);
    else add(2 * k + 1, x, A);
    tree[k].w = tree[2 * k].w + tree[2 * k + 1].w;
}

void ask(int k)
{
    if (tree[k].l == tree[k].r)
    {
        ans = tree[k].w;
        return;
    }
    int m = (tree[k].l + tree[k].r) / 2;
    if (x <= m)ask(k * 2);
    else ask(k * 2 + 1);
}

void sum(int k)
{
    if (tree[k].l >= x && tree[k].r <= y)
    {
        ans += tree[k].w;
        return ;
    }
    int m = (tree[k].l + tree[k].r) / 2;
    if (x <= m)sum(k * 2);
    if (y > m)sum(k * 2 + 1);
}

int main()
{
    int n, Q, op, i;
    cin >> n;
    build(1, n, 1);
    cin >> Q;
    while (Q--)
    {
        cin >> op;
        if (op == 1)
        {
            cin >> x >> y >> A;
            for (i = x; i <= y; i++)
            {
                add(1, i, A);
            }
        }
        if (op == 2)
        {
            cin >> x >> y;
            sum(1);
            cout << ans << endl;
        }
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weifuliu/article/details/80413940
今日推荐