上帝造人的七分钟
\(Get\ Many\ Persimmon\ Trees\)
上帝造人的七分钟,裸题就意味着神题(一道语文题)。
心血来潮就来发一下\(Pascal\)的代码。
具体的做法也是大佬们写出来了,这里不重复。
要注意一点,如果刚学完树状数组,可能会把二维数组写成\(while\)的形式,然后就傻*的\(WA*N+RE*M\)。
\(Pascal\)写成\(tree[mode,x,y]\)的形式会好看很多吧。
var
tree:array[1..4,-1..110,-1..110] of longint; // 维护的数组
place:array[1..4] of longint; //输入用
i,j,num,n,m:longint;
mode:char; //命令标识
function lowbit(num:longint):longint; begin exit(num and -num); end;
procedure Insert(x,y,num:longint); //add函数
var
i,j:longint;
begin
i:=x;
while i<n do
begin
j:=y; //坑点
while j<m do
begin
inc(tree[1,i,j],num); //这样子写就不会卡常哦,qwq
inc(tree[2,i,j],num*y);
inc(tree[3,i,j],num*x);
inc(tree[4,i,j],num*x*y);
inc(j,lowbit(j));
end;
inc(i,lowbit(i));
end;
end;
function Sum(x,y:longint):longint; //答案
var
i,j:longint;
begin
i:=x; Sum:=0;
while i>0 do
begin
j:=y; //坑点
while j>0 do
begin
inc(Sum,tree[1,i,j]*(x+1)*(y+1)-tree[2,i,j]*(x+1)-tree[3,i,j]*(y+1)+tree[4,i,j]); //这样子写就不会卡常哦,qwq
dec(j,lowbit(j));
end;
dec(i,lowbit(i));
end;
end;
begin
readln(mode,n,m);
while not eof do //操作
begin
read(mode,place[1],place[2],place[3],place[4]);
if mode='L' then
begin
readln(num);
Insert(place[1],place[2],num);
Insert(place[1],place[4]+1,-num);
Insert(place[3]+1,place[2],-num);
Insert(place[3]+1,place[4]+1,num);
end;
if mode='k' then
begin
readln; //坑点
writeln(Sum(place[3],place[4])-Sum(place[1]-1,place[4])-Sum(place[3],place[2]-1)+Sum(place[1]-1,place[2]-1));
end;
end;
end.
完结撒花!✿✿ヽ(゚▽゚)ノ✿