树状数组

21 篇文章 0 订阅
1 篇文章 0 订阅

好像没啥好讲的

求sum-lowbit

   修改+lowbit;

二维和一维差不多。。

Code :

一维:

function lowbit(x:longint):longint;
begin
	exit(x and (-x));
end;
procedure add(x,data:longint);
begin
	while (x<=n) do
	begin
		inc(c[x],data);
		x:=x+lowbit(x);
	end;
end;
function sum(x:longint):longint;
begin
	sum:=0;
	while x>0 do
	begin
		inc(sum,c[x]);
		x:=x-lowbit(x);
	end;
end;
procedure main;
begin
	readln(n);
	for i:=1 to n do
	begin
		readln(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;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值