sutacm

poj3468一个简单的整数问题,我昨天一下午才写好的水代码。

查看不能折叠的水代码
#include<stdio.h>
struct
{
    int s, e;
    long long int s1, s2;
} x[262144];
void set(int s, int e, int t)
{
    x[t].s = s;
    x[t].e = e;
    if (s != e)
    {
        set(s, (s + e) >> 1, (t << 1) + 1);
        set(((s + e) >> 1) + 1, e, (t << 1) + 2);
    }
}

long long int CQ(int s, int e, long long int a, int t)
{
    int m;
    long long int n;
    x[t].s1 += a * (e - s + 1);
    if ((x[t].s == s) && (x[t].e == e))
    {
        x[t].s2 += a;
        return x[t].s1;
    }
    else
    {
        m = (x[t].s + x[t].e) >> 1;
        n = (s <= m) ? CQ(s, (m < e ? m : e), a, (t << 1) + 1) : 0;
        n += (e > m) ? CQ((m >= s ? m + 1 : s), e, a, (t << 1) + 2) : 0;
        return x[t].s2 * (e - s + 1) + n;
    }
}

int main()
{
    int n, m, i;
    long long int a;
    char c;
    scanf("%d %d", &n, &m);
    set(1, n, 0);
    for (i = 1; i <= n; i++)
    {
        scanf("%lld", &a);
        CQ(i, i, a, 0);
    }
    while (m--)
    {
        getchar();
        scanf("%c %d %d", &c, &i, &n);
        if (c == 'Q')
            printf("%lld\n", CQ(i, n, 0, 0));
        else
        {
            scanf("%lld", &a);
            CQ(i, n, a, 0);
        }
    }
    return 0;
}

以后做题一定要注意取值范围。。。谨以此题为戒。

posted @ 2013-02-04 17:21  sut_ningwei  阅读(149)  评论(0编辑  收藏  举报