上帝造人的七分钟

\(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.
posted @ 2018-09-22 21:57  _ARFA  阅读(245)  评论(0编辑  收藏  举报