树状数组

来源:互联网 发布:王者荣耀网络延迟460 编辑:程序博客网 时间:2024/05/16 15:10

好像没啥好讲的

求sum-lowbit

   修改+lowbit;

二维和一维差不多。。

Code :

一维:

function lowbit(x:longint):longint;beginexit(x and (-x));end;procedure add(x,data:longint);beginwhile (x<=n) dobegininc(c[x],data);x:=x+lowbit(x);end;end;function sum(x:longint):longint;beginsum:=0;while x>0 dobegininc(sum,c[x]);x:=x-lowbit(x);end;end;procedure main;beginreadln(n);for i:=1 to n dobeginreadln(a[i]);add(i,a[i]);end;end;

二维:

var c:array[0..1100,0..1100] of longint;    m,a,b,x,y,i,j,k,n:longint;function lowbit(x:longint):longint;begin    exit(x and (-x));end;procedure add(x,y,data:longint);var y0:longint;begin    y0:=y;    while (x<=n) do    begin        y:=y0;        while (y<=n) do        begin            inc(c[x,y],data);            y:=y+lowbit(y);        end;        x:=x+lowbit(x);    end;end;function sum(x,y:longint):longint;var y0:longint;begin    y0:=y;    sum:=0;    while (x>0) do    begin        y:=y0;        while (y>0) do        begin            inc(sum,c[x,y]);            y:=y-lowbit(y);        end;        x:=x-lowbit(x);    end;end;


0 0