HDU 4267 A Simple Problem with Integers 2012 ACM/ICPC Asia Regional Changchun Online 1001

这道题即区间更新,单点查询,所以只需要维护区间的增加量即可。

因为1<=k<=10,所以对于不同的起始区间不同的k,一共有55种情况,所以,用开个55的数组即可维护。

利用ZKW线段树思想,标记永久化,每次查到根就over。。

这题方法很多的说,维护10棵树状数组也行,sqrt(n)的方法也行。。。

不过比赛时没想到怎么解决不同的起始区间的k值,算了下还可能MLE,没敢写。。。郁闷。。


#include <cstdio>
#include <cstring>
#include <algorithm>
#define L(x) (x<<1)
#define R(x) (x<<1|1)

using namespace std;

int n, q, num;
int add[1<<17][55];
int left[1<<17], right[1<<17];
int arr[50100];

void init()
{
    memset(add,0,sizeof(add));
    for ( int i = 0 ; i < num ; i++ )
        left[i+num]=right[i+num]=i;
    for ( int i = num-1 ; i ; i-- )
    {
        left[i]=left[L(i)];
        right[i]=right[R(i)];
    }
}

void update(int s, int t, int k, int val)
{
    int tag = s%k;
    for ( int i = 1 ; i < k ; i++ )
        tag+=i;
    for ( s=s+num-1, t=t+num+1 ; s^t^1 ; s>>=1, t>>=1 )
    {
        if (~s&1)
            add[s^1][tag]+=val;
        if (t&1)
            add[t^1][tag]+=val;
    }
}

int query(int m)
{
    int ans=0, start=m;
    for ( m+=num ; m ; m>>=1 )
        for ( int k = 1 ; k <= 10 ; k++ )
        {
            int tag=start%k;
            for ( int i = 1 ; i < k ; i++ )
                tag+=i;
            ans+=add[m][tag];
        }
    return ans;
}

int main()
{
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    while (EOF!=scanf("%d", &n))
    {
        for ( int i = 1; i <= n ; i++ )
            scanf("%d", arr+i);
        scanf("%d", &q);
        int cmd, l,r,k,val;
        for (num=1;num<(n+2);num<<=1);
        init();
        while (q--)
        {
            scanf("%d", &cmd);
            if (1==cmd)
            {
                scanf("%d%d%d%d", &l, &r, &k, &val);
                update(l,r,k,val);
            }
            else if (2==cmd)
            {
                scanf("%d", &k);
                printf("%d\n", arr[k]+query(k));
            }
        }
    }
    return 0;
}

posted on 2012-09-09 21:47 purplest 阅读(378) 评论(0)  编辑 收藏 引用 所属分类: 线段树


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论