tyvj1716上帝造题的七分钟——by rfy

来源:互联网 发布:zblog php模板 编辑:程序博客网 时间:2024/05/17 02:06

二维树状数组区间加区间求和

很好的blog(赞!) http://hi.baidu.com/wyl8899/item/c3ac1c0eec3516ea34990267

我的丑陋代码:

varn,m,x,y,xx,yy,v:longint;ch:char;add,a,b,c,d:array[0..3000,0..3000] of longint;procedure insert(x,y,v:longint);vari,j:longint;beginadd[x,y]:=add[x,y]+v;i:=x;while i<=n dobegin  j:=y;  while j<=m do  begin    a[i,j]:=a[i,j]+v;    b[i,j]:=b[i,j]+v*x;    c[i,j]:=c[i,j]+v*y;    d[i,j]:=d[i,j]+v*x*y;    j:=j+j and (-j);  end;  i:=i+i and (-i);end;end;function sum(x,y:longint):longint;vars1,s2,s3,s4,i,j:longint;begini:=x;s1:=0;s2:=0;s3:=0;s4:=0;while i>0 dobegin  j:=y;  while j>0 do  begin    s1:=s1+a[i,j];    s2:=s2+b[i,j];    s3:=s3+c[i,j];    s4:=s4+d[i,j];    j:=j-j and (-j);  end;  i:=i-i and (-i);end;exit(s1*(x+1)*(y+1)-s2*(y+1)-s3*(x+1)+s4);end;beginreadln(ch,n,m);while not eof dobegin  read(ch);  if ch='L' then  begin    readln(x,y,xx,yy,v);    insert(x,y,v);    insert(xx+1,yy+1,v);    insert(x,yy+1,-v);    insert(xx+1,y,-v);  end  else  begin    readln(x,y,xx,yy);    writeln(sum(xx,yy)+sum(x-1,y-1)-sum(x-1,yy)-sum(xx,y-1));  end;end;end.


0 0
原创粉丝点击