HDU 4267 A Simple Problem with Integers

本文介绍了一种使用三维树状数组来解决区间更新和查询问题的方法,详细解释了算法思路和实现过程,通过实例代码演示了解决步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4267

题        意:给出一个n数组,进行两项操作:

                             一:当m=1时,输入a,b,k,c;将所有a到b内满足(i-a)%k==0的项加上c。

                             二:当m=2时,输入想,输出第x个数。

思        路:定义一个三维树状数组ben[N][12][12],将每一个数所要加的数存入树状数组。

代码如下:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
typedef int LL;

const int N = 50010;
int vis[N], n;
int ben[N][12][12];

int lowbit( int t )
{
    return t & ( -t );
}

void update( int pos, int num, int k, int mod )
{
    while( pos <= n )
    {
        ben[pos][k][mod] += num;
        pos += lowbit(pos);
    }
}

int getsum( int x, int y )
{
     int sum = 0;
     while( x > 0 )
     {
         for( int k = 1; k <= 10; k ++ ){//列举k的值(1,10),将x所对应的项要加的数全部处理
            sum += ben[x][k][y%k];
         }
         x -= lowbit(x);
     }
     return sum;
}

int main()
{
    while( scanf ( "%d", &n ) != EOF )
    {
        memset( ben, 0, sizeof( ben ) );
        for( int i = 1; i <= n; i ++ )
            scanf ( "%d", &vis[i] );
        LL q;
        scanf ( "%d", &q );
        for( int i = 0; i < q; i ++ )
        {
            int m;
            scanf ( "%d", &m );
            if( m == 1 )
            {
                LL a, b, k, c;
                scanf ( "%d %d %d %d", &a, &b, &k, &c );
                update( a, c, k, a%k );
                update( b+1, -c, k, a%k );
            }
            else
            {
                LL x;
                scanf ( "%d", &x );
                printf( "%d\n", vis[x]+getsum(x,x) );//原数加上要加的数
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值