| ||||||||||
| 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 | |||||||||
二维树状数组 TLE 的同学们注意了 ! 下标从0开始。 附上测试数据。TLE 的同学们注意了。下标从0开始。附上测试数据。
in
0 1
1 0 0 28766
2 0 0 0 0
1 0 0 -2826
2 0 0 0 0
1 0 0 -587
2 0 0 0 0
1 0 0 1017
2 0 0 0 0
1 0 0 -17234
2 0 0 0 0
1 0 0 19618
2 0 0 0 0
1 0 0 -2237
2 0 0 0 0
1 0 0 -9192
2 0 0 0 0
1 0 0 -11132
2 0 0 0 0
1 0 0 1842
2 0 0 0 0
3
out
28766
25940
25353
26370
9136
28754
26517
17325
6193
8035
过了这组应该就没有问题了。
//////////////My AC Code///////////////////
/* 641MS C++ */
/* 1079MS G++ */
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int MAXN = 1050;
int s[MAXN][MAXN];
int lowbit[MAXN];
int n;
int sum(int x, int y)
{
int res = 0;
for(int i = x; i > 0; i -= lowbit[i])
for(int j = y; j > 0; j -= lowbit[j])
res += s[i][j];
return res;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int op;
int x, y, v;
int x1, y1, x2, y2;
for(int i = 1; i <= MAXN; i++)
{
lowbit[i] = i&-i;
}
while(1)
{
scanf("%d", &op);
if(op == 1)
{
scanf("%d %d %d", &x, &y, &v);
x++; y++;
for(int i = x; i <= n; i += lowbit[i])
for(int j = y; j <= n; j += lowbit[j])
s[i][j] += v;
}
else if(op == 2)
{
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
x1++; y1++; x2++; y2++;
int ans = sum(x2, y2)+sum(x1-1, y1-1)-sum(x1-1, y2)-sum(x2, y1-1);
printf("%d\n", ans);
}
else if(op == 0)
{
scanf("%d", &n);
memset(s, 0, sizeof(s));
}
else
break;
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator