HDU4267(2012长春网络赛)

题目:A Simple Problem with Integers

 

#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;

const int N = 50100;

struct node
{
     int l;
     int r;
     int w;
     int add[55] ;
}p[N*4];

int a[N], b[11][11];

void build(int x,int l,int r)
{
     p[x].l = l;
     p[x].r = r;
     memset(p[x].add,0,sizeof(p[x].add));
     if(l == r)
     {
         p[x].w = a[l];
         return ;
     }
     int mid = (l + r)>>1;
     build(2*x,l,mid);
     build(2*x+1,mid+ 1,r);
     p[x].w = p[x*2].w + p[x*2+1].w ;
 }

 void push_down(int x)
 {
     if(p[x].w)
     {
         p[x*2].w +=p[x].w;
         p[x*2+1].w +=p[x].w;
         p[x].w = 0;
         for(int i =0  ; i < 55;i++)
         {
             p[x*2].add[i] +=p[x].add[i];
             p[x*2+1].add[i]+=p[x].add[i];
             p[x].add[i] = 0;
         }
     }
 }
 void update(int x,int l,int r,int num,int i,int j)
 {
     if(p[x].l == l&&p[x].r == r)
     {
         p[x].w +=num;
         p[x].add[b[i][j]]+=num ;
         return ;
     }
     push_down(x);
     int mid = (p[x].l + p[x].r)>>1 ;
     if(l > mid)update(x*2+1,l,r,num,i,j);
     else
     {
         if(r<=mid)
             update(x*2,l,r,num,i,j);
         else
         {
             update(x*2,l,mid,num,i,j);
             update(x*2+1,mid+1,r,num,i,j);
         }
     }
 }

 int query(int x,int pos)
 {
     if(p[x].l == pos&&p[x].r == pos)
     {
         int tmp = 0;
         for(int i = 1 ; i <= 10 ;i++)
             tmp+=p[x].add[b[i][pos%i]];
         return tmp + a[pos] ;
     }
     push_down(x) ;
     int mid = (p[x].l + p[x].r)>> 1;
     if(pos <= mid)
         return   query(2*x,pos);
     else
         return query(x*2+1,pos);
 }

 int main()
 {
     int  n,s,e,k,c,i,j,q,ty;
     int cnt = 0;
     for(i = 1; i<= 10;i++)
     {
         for(j = 0;j< i;j++)
           b[i][j] = cnt++;           //由于内存卡的紧,所以这样编号,不能开 10*10 的
     }
     while(scanf("%d",&n)!=EOF)
     {
         for(i =1  ; i <=n;i++)
         {
             scanf("%d",&a[i]) ;
         }
         build(1,1,n);
         scanf("%d",&q);
         while(q--)
         {
             scanf("%d",&ty);
             if(ty==1)
             {
                 scanf("%d%d%d%d",&s,&e,&k,&c);
                 update(1,s,e,c,k,s%k);          //这里为什么是 s% k 呢 ,因为 :
             }                                   //(i- s)%k = (i%k - s%k + k)%k = 0 的话 i%k 应该  = s%k ;
             else
             {
                 int  pos;
                 scanf("%d",&pos);
                 int ans = query(1,pos);
                 printf("%d\n",ans);
             }

         }
     }
     return 0;
 }


 

你可能感兴趣的:(HDU4267(2012长春网络赛))