2012 ACM/ICPC Asia Regional Changchun Online-1001

来源:互联网 发布:js设置元素样式 编辑:程序博客网 时间:2024/04/30 13:38

//一个线段树题,把k=1这种情况进行扩展,扩展到10就可以了;

 

代码如下:

 

#include<stdio.h>#include<string.h>struct node{    int d[11];}sum[210000];void build(int i,int l,int r){    int j,mid;    for(j=1;j<=10;j++)        sum[i].d[j]=0;    if(l==r)return;    else     {        mid=(l+r)>>1;        build(i<<1,l,mid);        build(i<<1|1,mid+1,r);    }}void update(int i,int l,int r,int a,int b,int c,int k){    int mid,s,t;    if(a>b)return;    if(l==a&&b==r)        sum[i].d[k]+=c;    else     {        mid=(l+r)>>1;        if(b<=mid)            update(i<<1,l,mid,a,b,c,k);        else if(b>mid&&a<=mid)         {            update(i<<1,l,mid,a,mid,c,k);            s=mid+1;            t=(s-a)%k;            if(t!=0)s+=k-t;            if(s<=b)                update(i<<1|1,mid+1,r,s,b,c,k);        }        else update(i<<1|1,mid+1,r,a,b,c,k);    }}int query(int i,int l,int r,int p,int k){    int mid,ans=0;    if(l==r)        return sum[i].d[k];    else     {        mid=(l+r)>>1;        if((p-l)%k==0)            ans=sum[i].d[k];        if(p<=mid)            return ans+query(i<<1,l,mid,p,k);        else            return ans+query(i<<1|1,mid+1,r,p,k);    }}int num[60000];int main(){    int n,m,i,op,a,b,c,k,j;    while(scanf("%d",&n)!=EOF)    {        for(i=1;i<=n;i++)            scanf("%d",&num[i]);        scanf("%d",&m);        build(1,1,n);        while(m--)        {            scanf("%d",&op);            if(op==1)            {                scanf("%d%d%d%d",&a,&b,&k,&c);                update(1,1,n,a,b,c,k);            }            else             {                    scanf("%d",&a);b=0;                for(j=1;j<=10;j++)                    b+=query(1,1,n,a,j);                printf("%d\n",b+num[a]);            }        }    }    return 0;}


 

原创粉丝点击