1. 程式人生 > >hdu 4267 A Simple Problem with Integers

hdu 4267 A Simple Problem with Integers

pre pri ets using type main return ger 如果

題意:給出一個長為n的序列,然後有q個操作,有兩種操作方式

  1.輸入a,b,k,c,表示將區間[a,b]中的數i滿足(i-a)%k == 0加上c.   2.輸入一個數y,輸出序列中第y個數的值。 思路:如果是使得一個區間(L,R)的值加上c,那麽我們可以讓a[L]+c,a[R+1]-c,求個前綴即可知道增加了多少 但這裏是隔k個+c,由於k很小,所以我們可以定義a[k][i%k][x],用樹狀數組來維護
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=50005;
 4 
 5
int a[12][12][N]; 6 int b[N]; 7 int n; 8 9 void add(int i,int j,int x,int val){ 10 while(x<=n){ 11 a[i][j][x]+=val; 12 x+=(x)&(-x); 13 } 14 } 15 16 int getsum(int i, int j, int x) 17 { 18 int sum=0; 19 while(x>0) 20 { 21 sum+=a[i][j][x];
22 x-=(x)&(-x); 23 } 24 return sum; 25 } 26 int main(){ 27 28 while(~scanf("%d",&n)){ 29 memset(a,0,sizeof(a)); 30 for(int i=1;i<=n;i++) { 31 scanf("%d",&b[i]); 32 } 33 int q; 34 scanf("%d",&q); 35 for
(int i=1;i<=q;i++){ 36 int type; 37 scanf("%d",&type); 38 if(type==1){ 39 int l,r,k,c; 40 scanf("%d%d%d%d",&l,&r,&k,&c); 41 add(k, l%k, l, c); 42 add(k, l%k, r+1, -c); 43 } 44 else { 45 int x; 46 scanf("%d",&x); 47 int sum=b[x]; 48 for(int i=1;i<=10;i++){ 49 sum+=getsum(i,x%i,x); 50 } 51 printf("%d\n",sum); 52 } 53 } 54 } 55 }

hdu 4267 A Simple Problem with Integers