zoukankan      html  css  js  c++  java
  • HDU4267 树状数组

      

    题意描述:

    给定一个数组,有两种操作:

    操作一:a b k c 对于区间a~b之间的元素如果下标满足(i-a)%k=0则给元素i加上c

    操作二:a          查询下标为a的元素当前值

    解题思路:

    1、首先这个涉及到区间修改点查询,所以应该想到使用树状数组或线段树

    2、修改的区间是不连续的,为了使不连续可以转换为连续的,我们对每种情况进行枚举,有55种情况

    即对k=1   有0

            k=2   有0 、1

            k=3    有0、1、2

    ···

            k=10   有0、1、2、3、4、5、6、7、8、9

    所以我们可以声明一个三维数组c[k][i][j]:其中k%i=j的元素,表示k属于i,j这个树状数组

    对于操作一:我们只需更改a[MAXN][k][a%k]这个树状数组内的连续区间,即

    update(a,c);

    update(b+1,-c);

    对于a、b之间的不满足a%k的元素虽然我们也更新了,但是我们在查询的时候不会在a[MAXN][k][a%k]这个树状数组中查询,所以这个也就没有关系了

    对于操作二:我们只需要查询a[a][i][a%i]即可,其中i从1到10,累加起来就可以了。最后加上d[a](位置a的初始值)

    #include<bits/stdc++.h>
    using namespace std;
    
    #define N 50010
    #define fo(i,n) for(int i=0;i<(n);i++)
    int c[N][11][10];
    int s[N];
    int n;
    int lowbit(int i)
    {
        return i&(-i);
    }
    
    void update(int pos,int k,int mod,int v)
    {
        for(int i=pos;i<=n;i+=lowbit(i))
            c[i][k][mod]+=v;
    
    
    
    }
    
    int sum(int pos,int a)
    {
        int ans=0;
        for(int i=pos;i>0;i-=lowbit(i))
            for(int j=1;j<=10;j++)
               ans+=c[i][j][a%j];
        return ans;
    }
    
    int main()
    {
        while(scanf("%d",&n)==1)
        {
            for(int i=1;i<=n;i++)scanf("%d",&s[i]);
            memset(c,0,sizeof c);
            int m;cin>>m;
            while(m--)
            {
                int op,a,b,k,add;
                scanf("%d",&op);
                if(op==1)
                {
                    scanf("%d%d%d%d",&a,&b,&k,&add);
                    update(a,k,a%k,add);
                    update(b+1,k,a%k,-add);
    
                }
                else
                {
                    scanf("%d",&a);
                    printf("%d
    ",sum(a,a)+s[a]);
    
                }
    
    
    
    
            }
    
    
    
        }
    
    
    
    }
  • 相关阅读:
    移动端input中的placeholder属性垂直
    js将文字转化为语音并播放
    js生成二维码
    jquery移除事件,绑定事件,触发事件
    js计算本地时间
    正则判断支付金额
    去除input默认带的上下按钮与修改placeholder的默认颜色、背景、placeholder内容的大小
    rem自适应手机端布局
    Python_PyQt5_库
    Python_用PyQt5 建 notepad 界面
  • 原文地址:https://www.cnblogs.com/bxd123/p/10483769.html
Copyright © 2011-2022 走看看