Problem I
Time Limit : 5000/1500ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 17 Accepted Submission(s) : 5
Problem Description
Let A1, A2, ... , AN be N elements. You need to deal with two kinds of operations. One type of operation is to add a given number to a few numbers in a given interval. The other is to query the value of some element.
Input
There are a lot of test cases. The first line contains an integer N. (1 <= N <= 50000) The second line contains N numbers which are the initial values of A1, A2, ... , AN. (-10,000,000 <= the initial value of Ai <= 10,000,000) The third line contains an integer Q. (1 <= Q <= 50000) Each of the following Q lines represents an operation. "1 a b k c" means adding c to each of Ai which satisfies a <= i <= b and (i - a) % k == 0. (1 <= a <= b <= N, 1 <= k <= 10, -1,000 <= c <= 1,000) "2 a" means querying the value of Aa. (1 <= a <= N)
Output
For each test case, output several lines to answer all query operations.
Sample Input
4 1 1 1 1 14 2 1 2 2 2 3 2 4 1 2 3 1 2 2 1 2 2 2 3 2 4 1 1 4 2 1 2 1 2 2 2 3 2 4
Sample Output
1 1 1 1 1 3 3 1 2 3 4 1
思路:根据每个数相对起点的对k取余得到余数的值维护多个树状数组。。。。难啊。。。。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 50010
int N,M;
int a[maxn];
struct node{
int a[maxn];
int lowbit(int x){
return x&(-x);
}
void clear(){
memset(a,0,sizeof(a));
}
int getsum(int x){
int res=0;
while(x){
res+=a[x];
x-=lowbit(x);
}
return res;
}
void update(int l,int r,int c){
while(l<=N+1){
a[l]+=c;
l+=lowbit(l);
}
r++;
while(r<=N+1){
a[r]+=-c;
r+=lowbit(r);
}
}
}tree[11][11]; //多个数组
int main(){
while(scanf("%d",&N)!=EOF){
for(int i=1;i<=N;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<=10;i++){
for(int j=0;j<=10;j++){
tree[i][j].clear(); //初始化为0
}
}
int op,x,y,k,c;
scanf("%d",&M);
while(M--){
scanf("%d",&op);
if(op==1){
scanf("%d%d%d%d",&x,&y,&k,&c);
int j=(x-1)%k;
tree[k][j].update(x,y,c); //进行变化
} else {
scanf("%d",&x);
int ans=0;
for(int i=1;i<=10;i++){
ans+=tree[i][(x-1)%i].getsum(x); //得到这个数的总的变化数
}
printf("%d\n",ans+a[x]);
}
}
}
return 0;
}