HDU 4267 A Simple Problem with Integers 数列离散化 + 树状数组
2012-09-11 19:15
471 查看
题意:对一个长度为n(n <= 50000)的数列A进行m(m <= 50000)次操作(2种):
1:给定a,b,k,c四个整数,在[a , b] 区间满足a<=i<=b && (i-a)% k == 0的数加c(1<=k<=10);
2:给定整数a,求当前A[a];
题解:想办法把间隔的数字搞到一起,因为1<=k<=10,所以一共最多只能形成55个个序列,即:
1,2,3,4,5…(k=1)
1,3,5,7,9…(k=2)
2,4,6,8,10…(k=2)
1,4,7,10,13…(k=3)
2,5,9,12,15…(k=3)
3,6,10,13,16…(k=3)
…
1,11,21,31,41…(k=10)
…
10,20,30,40,50...(k=10)
想象中将这些序列按照k不同离散化,然后用树状数组维护区间修改,点查询的时候要枚举k即可。
Sure原创,转载请注明出处。
1:给定a,b,k,c四个整数,在[a , b] 区间满足a<=i<=b && (i-a)% k == 0的数加c(1<=k<=10);
2:给定整数a,求当前A[a];
题解:想办法把间隔的数字搞到一起,因为1<=k<=10,所以一共最多只能形成55个个序列,即:
1,2,3,4,5…(k=1)
1,3,5,7,9…(k=2)
2,4,6,8,10…(k=2)
1,4,7,10,13…(k=3)
2,5,9,12,15…(k=3)
3,6,10,13,16…(k=3)
…
1,11,21,31,41…(k=10)
…
10,20,30,40,50...(k=10)
想象中将这些序列按照k不同离散化,然后用树状数组维护区间修改,点查询的时候要枚举k即可。
Sure原创,转载请注明出处。
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; const int maxn = 50002; const int maxm = 12; int list[maxn],c[maxn][maxm][maxm]; int m,n; inline void in(int &a) { bool flag = true; char ch; while(ch = getchar(), ch < '0' || ch > '9') { if(ch == '-') flag = false; } a = ch - '0'; while(ch = getchar(), ch >= '0' && ch <= '9') { a = a * 10 + ch - '0'; } if(flag == false) a = -a; return; } inline int lowbit(int x) { return x & (-x); } void update(int i,int j,int k,int val,int lim) { while(i <= lim) { c[i][j][k] += val; i += lowbit(i); } return; } int sum(int i,int j,int k) { int res = 0; while(i > 0) { res += c[i][j][k]; i -= lowbit(i); } return res; } void read() { memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) { in(list[i]); } return; } void solve() { int tmp,a,b,k,val; in(m); while(m--) { in(tmp); if(tmp == 1) { in(a),in(b),in(k),in(val); int wei = a % k + 1; b += k - ((b - a) % k); a = (a - 1) / k + 1; b = (b - 1) / k + 1; update(a , k , wei , val , n / k + (n % k != 0)); update(b , k , wei , -val , n / k + (n % k != 0)); } else { in(a); int res = list[a]; for(int i=1;i<=10;i++) { int wei = a % i + 1; int st = (a - 1) / i + 1; res += sum(st , i , wei); } printf("%d\n",res); } } return; } int main() { while(~scanf("%d",&n)) { read(); solve(); } return 0; }
相关文章推荐
- hdu 4267 A Simple Problem with Integers 树状数组
- 【三维树状数组与离散化】HDU 4267——A Simple Problem with Integers
- HDU 4267 A Simple Problem with Integers --树状数组
- 【树状数组区间修改单点查询+分组】HDU 4267 A Simple Problem with Integers
- hdu(4267)A Simple Problem with Integers(三维树状数组)
- HDU 4267 A Simple Problem with Integers --树状数组
- hdu 4267 A Simple Problem with Integers(树形结构-线段树)
- HDU 4267 A Simple Problem with Integers 2012 ACM/ICPC Asia Regional Changchun Online
- hdu 4267 A Simple Problem with Integers 线段树,区间部分更新
- ChangChun_1001 A Simple Problem with Integers (HDU 4267)
- HDU 4267 A Simple Problem with Integers(线段树)
- HDU 4267 A Simple Problem with Integers (线段树)
- HDU 4267 A Simple Problem with Integers
- HDU 4267 A Simple Problem with Integers
- HDU 4267 A Simple Problem with Integers 多个树状数组
- HDU 4267 A Simple Problem with Integers
- HDU 4267 A Simple Problem with Integers Regional Changchun Online
- hdu 4267 A Simple Problem with Integers(线段树)
- HDU 4267 A Simple Problem with Integers(2012年长春网络赛A 多颗线段树+单点查询)
- HDU 4267 A Simple Problem with Integers