Light oj 1112 - Curious Robin Hood(树状数组)

简介: 有n个数,有m组操作,1 i表示将第i个数先输出,然后置0, 2 i v 表示给第i个数加上v, 3 i j 表示求i 到 j 的和,注意,这里数组是从0开始的,而我们构造的树状数组是从1开始的,使用在程序中要进行一定的处理。

题意:

  有n个数,有m组操作,1 i表示将第i个数先输出,然后置0, 2 i v 表示给第i个数加上v, 3 i j 表示求i 到 j 的和,注意,这里数组是从0开始的,而我们构造的树状数组是从1

开始的,使用在程序中要进行一定的处理。

//LA 1112 - Curious Robin Hood(树状数组)
//2013-04-13-08.22
#include <stdio.h>
#include <string.h>
const int maxn = 100010;
int a[maxn], b[maxn];
int n;
int lowbit(int x)
{
    return x&(-x);
}
void update(int x, int v)
{
    while (x <= n)
    {
        a[x] += v;
        x += lowbit(x);
    }
}
int getsum(int x)
{
    int sum = 0;
    while (x)
    {
        sum += a[x];
        x -= lowbit(x);
    }
    return sum;
}
int main()
{
    int t, m;
    scanf("%d",&t);
    for (int k = 1; k <= t; k++)
    {
        scanf("%d %d",&n, &m);
        memset(a, 0 ,sizeof(a));
        for (int i = 1; i <= n; i++)
        {
            scanf("%d",&b[i]);
            update(i, b[i]);
        }
        int op, i, v, j;
        printf("Case %d:\n",k);
        while (m--)
        {
            scanf("%d",&op);
            if (op == 1)
            {
                scanf("%d",&i);
                printf("%d\n",b[i+1]);
                update(i+1, -b[i+1]);
                b[i+1] = 0;
            }
            else if (op == 2)
            {
                scanf("%d %d",&i, &v);
                update(i+1, v);
                b[i+1] += v;
            }
            else
            {
                scanf("%d %d",&i,&j);
                printf("%d\n",getsum(j+1) - getsum(i));
            }
        }
    }
    return 0;
}


目录
相关文章
|
算法
The kth great number(小根堆思想,模板题)
The kth great number(小根堆思想,模板题)
48 0
The kth great number(小根堆思想,模板题)
light oj 1159 - Batman LCS
学过简单动态规划的人应该对最长公共子序列的问题很熟悉了,这道题只不过多加了一条字符串变成三条了,还记得,只要把状态变成三维的即可。
34 0
|
机器学习/深度学习
light oj 1005 - Rooks(组合数学)
组合数学解法 现在n行中选出m行,C(n,m),再在n列中选出m列随便放A(n,m),答案为C(n,m)*A(n,m)。
37 0
|
机器学习/深度学习 存储
light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
43 0
|
开发框架 .NET
poj 3468 A Simple Problem with Integers线段树区间修改
题目意思很简单,有N个数,Q个操作, Q l r 表示查询从l到r 的和,C l r v 表示将从l到r 的值加上v,明显的线段树,不知道线段树的人肯定暴力,肯定超时,哈哈!!
33 0
|
算法
light oj 1047 - Neighbor House 动态规划
动态规划,这个和刘汝佳算法竞赛入门经典P158的数字三角形有些相似,不过是求最小的值,而且有些限制,每次走到点和上次走的点不在同一列。
30 0
|
人工智能
poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
所谓离散化,我们的了解就是对原数组排序,然后用所在位置的下标代替原数,这样我们就可以把数据范围缩小到1-500000,这个数组是开的下的。
43 0
|
机器学习/深度学习 人工智能 BI
The Great Hero(Codeforces Round #700 (Div. 2))模拟+贪心思想和排序
The Great Hero(Codeforces Round #700 (Div. 2))模拟+贪心思想和排序
60 0
codeforces292——D. Connected Components(并查集+前缀和优化)
codeforces292——D. Connected Components(并查集+前缀和优化)
104 0
codeforces292——D. Connected Components(并查集+前缀和优化)
CF1310A. Recommendations(贪心 优先队列 并查集)
CF1310A. Recommendations(贪心 优先队列 并查集)
94 0