hdu4267 A Simple Problem with Integers(树状数组区间更新点查询)
来源:互联网 发布:java applet小程序实例 编辑:程序博客网 时间:2024/06/07 02:54
题目链接:点击打开链接
题意描述:
给定一个数组,有两种操作:
操作一: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 <cstdio>#include <cstring>#define MAXN 50010using namespace std;int num[MAXN],n;int cnt[MAXN][11][10];int inline lowbit(int x){ return x&(-x);}void inline update(int x,int k,int mod,int add){ while(x<=n){ cnt[x][k][mod]+=add; x+=lowbit(x); }}int inline sum(int x,int a){ int s=0; while(x>0){ for(int i=1;i<=10;++i) s+=cnt[x][i][a%i]; x-=lowbit(x); } return s;}int main(){ while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;++i) scanf("%d",&num[i]); memset(cnt,0,sizeof(cnt)); int m; scanf("%d",&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)+num[a]); } } } return 0;}
0 0
- hdu4267 A Simple Problem with Integers(树状数组区间更新点查询)
- POJ 3468 A Simple Problem with Integers (树状数组解法 树状数组区间更新 区间查询)
- HDU4267 A Simple Problem with Integers(树状数组)
- hdu4267--A Simple Problem with Integers(树状数组)
- A Simple Problem with Integers(树状数组HDU4267)
- POJ 3468 A Simple Problem with Integers 树状数组(区间更新,区间查询)
- A Simple Problem with Integers(树状数组,更新区间查询区间模板)
- poj 3468 A Simple Problem with Integers(线段树+树状数组区间更新区间查询)
- poj 3468 A Simple Problem with Integers(线段树区间更新 or 树状数组区间更新)
- poj 3468 A Simple Problem with Integers (线段树区间更新 + 树状数组区间更新)
- 20140719 「树状数组 - 区间更新,区间求和」 POJ 3468 A Simple Problem with Integers
- poj-3468-A Simple Problem with Integers(树状数组更新区间查区间)
- 线段树—区间更新 HDU4267 A Simple Problem With Integers
- POJ 3468 A Simple Problem with Integers 树状数组 区间修改 区间查询
- POJ 3468 A Simple Problem with Integers 树状数组 区间修改 区间查询
- [POJ 2368 A Simple Problem with Integers] 树状数组区间修改、区间查询
- POJ 3468 A Simple Problem with Integers (树状数组) (区间修改+区间查询)
- POJ 3468 A Simple Problem with Integers(树状数组区间修改+区间查询)
- Html中px与em
- id选择器
- 破解windows系统本地用户密码
- C++ * a和*&a作为函数的参数时有什么区别
- 一分钟教你知道乐观锁和悲观锁的区别
- hdu4267 A Simple Problem with Integers(树状数组区间更新点查询)
- JavaScript高级之函数的四种调用形式
- android菜鸟进阶之路——布局的加载(父布局与子布局有先后顺序)
- GuideBackgroundColorAnimation
- java的private继承问题
- Delphi 连接SQLserver
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记43 保护NSNotification的内存安全
- 设计模式-观察者模式
- 女人对老公