| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我的程序能过,但还是WAIn Reply To:给一个线段树容易出错的测试用例 Posted by:fanlonglong8500 at 2008-08-25 10:54:41 #include <stdio.h>
#define N 100000
int n;
__int64 total;
struct node
{
__int64 sum;
int addPerElmt;
};
struct node line_tree[4 * N + 3];
void build_tree(int q, int left, int right);
void update(int q, int left, int right, int li, int ri, int value);
void question(int q, int left, int right, int li, int ri);
int main()
{
int qn;
int i;
int tmp;
char tc;
int begin, end, add;
scanf("%d %d", &n, &qn);
build_tree(0, 1, n);
for (i = 1; i <= n; i++)
{
scanf("%d", &tmp);
update(0, 1, n, i, i, tmp);
}
for (i = 0; i < qn; i++)
{
getchar();
scanf("%c", &tc);
if (tc == 'C')
{
scanf("%d %d %d", &begin, &end, &add);
update(0, 1, n, begin, end, add);
}
else
{
scanf("%d %d", &begin, &end);
total = 0;
question(0, 1, n, begin, end);
printf("%I64d\n", total);
}
}
return 0;
}
void build_tree(int q, int left, int right)
{
int mid = (left + right) >> 1;
line_tree[q].addPerElmt = 0;
line_tree[q].sum = 0;
if (left < right)
{
build_tree(q * 2 + 1, left, mid);
build_tree(q * 2 + 2, mid + 1, right);
}
}
void update(int q, int left, int right, int li, int ri, int value)
{
int mid = (left + right) >> 1;
if (left == li && right == ri)
{
line_tree[q].addPerElmt += value;
line_tree[q].sum += (ri - li + 1) * value;
return;
}
line_tree[q].sum += (ri - li + 1) * value;
if (li <= mid)
{
if (ri <= mid)
{
update(q * 2 + 1, left, mid, li, ri, value);
}
else
{
update(q * 2 + 1, left, mid, li, mid, value);
update(q * 2 + 2, mid + 1, right, mid + 1, ri, value);
}
}
else
update(q * 2 + 2, mid + 1, right, li, ri, value);
}
void question(int q, int left, int right, int li, int ri)
{
int mid = (left + right) >> 1;
if (left == li && right == ri)
{
total += line_tree[q].sum;
return;
}
if (line_tree[q].addPerElmt)
total += line_tree[q].addPerElmt * (ri - li + 1);
if (li <= mid)
{
if (ri <= mid)
{
question(q * 2 + 1, left, mid, li, ri);
}
else
{
question(q * 2 + 1, left, mid, li, mid);
question(q * 2 + 2, mid + 1, right, mid + 1, ri);
}
}
else
question(q * 2 + 2, mid + 1, right, li, ri);
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator