题意:要求设计这样一个数据结构,支持下列操作
1.add(x,y,a).对二维数组的第x行,第y列加上a.
2.sum(l,b,r,t).求所有满足l<=x<=r,b<=y<=t,的数组元素的和.
显然,二维树状数组满足这些要求.
code:
var c:array[0..1025,0..1025] of longint;
opt,n,x,y,a,l,b,r,t:longint;
function lowbit(i:longint):longint;
begin
lowbit:=i and (i xor (i-1));
end;
procedure change(x0,y0,a:longint);
var x,y:longint;
begin
x:=x0;
while x<=n do
begin
y:=y0;
while y<=n do
begin
inc(c[x,y],a);
inc(y,lowbit(y));
end;
inc(x,lowbit(x));
end;
end;
function getsum(x0,y0:longint):longint;
var x,y:longint;
begin
getsum:=0;
x:=x0;
while x>0 do
begin
y:=y0;
while y>0 do
begin
inc(getsum,c[x,y]);
dec(y,lowbit(y));
end;
dec(x,lowbit(x));
end;
end;
function query(x1,y1,x2,y2:longint):longint;
begin
exit(getsum(x2,y2)-getsum(x2,y1-1)-
getsum(x1-1,y2)+getsum(x1-1,y1-1));
end;
begin
readln(opt,n);
while opt<>3 do
begin
read(opt);
if opt=3 then halt;
case opt of
1:begin
readln(x,y,a);
change(x+1,y+1,a);
end;
2:begin
readln(l,b,r,t);
writeln(query(l+1,b+1,r+1,t+1));
end;
end;
end;
end.
浙公网安备 33010602011771号