您现在的位置是:主页 > news > 惠州模板做网站/百度联系电话

惠州模板做网站/百度联系电话

admin2025/6/3 20:34:52news

简介惠州模板做网站,百度联系电话,网站的漂浮广告怎么做,网站如何发布到网上题意描述: 给定一个数组,有两种操作: 操作一:a b k c 对于区间a~b之间的元素如果下标满足(i-a)%k0则给元素i加上c 操作二:a 查询下标为a的元素当前值 解题思路: 1、首先这个…

惠州模板做网站,百度联系电话,网站的漂浮广告怎么做,网站如何发布到网上题意描述: 给定一个数组,有两种操作: 操作一:a b k c 对于区间a~b之间的元素如果下标满足(i-a)%k0则给元素i加上c 操作二:a 查询下标为a的元素当前值 解题思路: 1、首先这个…

  

题意描述:

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

操作一: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\n",sum(a,a)+s[a]);}}}}

 

转载于:https://www.cnblogs.com/bxd123/p/10483769.html