Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

WA了N回了..TT..哪位高手能帮看看啊..感激不尽..

Posted by Alexandra at 2008-03-03 19:55:12 on Problem 3468
#include <stdio.h>
#include <iostream>

using namespace std;

const int N = 100600;

long n, m;
long num[N];
long long sum[N];

long len;
struct SegTree
{
    long long sum;
    long increment;
    long left, right;
    SegTree * Lchild, * Rchild;
    
    void Build(long, long);
    void Add(long, long, long);
    long long Query(long, long);
}Tree[2 * N], * Root = Tree;

void SegTree::Build(long l, long r)
{
    left = l; right = r;
    if(l + 1 == r)
    {
        Lchild = &Tree[++len]; Rchild = &Tree[++len];
        Lchild -> Build(l, l); Rchild -> Build(r, r);
        return;
    }
    if(l == r)
    {
        Lchild = Rchild = NULL;
        return;
    }
    int mid = (l + r) / 2;
    Lchild = &Tree[++len]; Rchild = &Tree[++len];
    Lchild -> Build(l, mid); Rchild -> Build(mid + 1, r);
}

long long SegTree::Query(long s, long t)
{
    if(increment)
    {
        if(Lchild)
        {
            Lchild -> increment = increment;
            Lchild -> sum += (Lchild -> right - Lchild -> left + 1) * increment;
        }
        if(Rchild)
        {
            Rchild -> increment = increment;
            Rchild -> sum += (Rchild -> right - Rchild -> left + 1) * increment;
        }
        increment = 0;
    }
    if(left == s && right == t)
        return sum;
    int mid = (left + right) / 2;
    if(t <= mid)
        return Lchild -> Query(s, t);
    if(s >= mid + 1)
        return Rchild -> Query(s, t);
    return Lchild -> Query(s, mid) + Rchild -> Query(mid + 1, t);
}

void SegTree::Add(long s, long t, long k)
{
    if(left == s && right == t)
    {
        increment = k;
        sum += (t - s + 1) * k;
        return;
    }
    long mid = (left + right) / 2;
    if(t <= mid)
    {
        Lchild -> Add(s, t, k);
        sum = Lchild -> sum + Rchild -> sum;
        return;
    }
    if(s >= mid + 1)
    {
        Rchild -> Add(s, t ,k);
        sum = Lchild -> sum + Rchild -> sum;
        return;
    }
    
    Lchild -> Add(s, mid, k);
    Rchild -> Add(mid + 1, t, k);
    
    sum = Lchild -> sum + Rchild -> sum;
}

void read()
{
    //freopen("p3468.in", "r", stdin);
    
    scanf("%ld %ld", &n, &m);
    for(int i = 1; i <= n; i++)
    {
        scanf("%ld", &num[i]);
        sum[i] = sum[i - 1] + num[i];
    }
}

int main()
{
    read();
    Root -> Build(1, n);
    
    long s, t, k;
    while(m)
        switch(getchar())
        {
            case 'Q' :
                m--;
                scanf("%ld %ld", &s, &t);
                printf("%I64d\n", Root -> Query(s, t) + sum[t] - sum[s - 1]);
                break;
            case 'C' :
                m--;
                scanf("%ld %ld %ld", &s, &t, &k);
                Root -> Add(s, t, k);
                break;
        }
    
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator