用树状数组求区间最值

本文介绍如何利用树状数组高效地进行区间最值的更新与查询。在更新最值时需考虑传递效应,查询时需判断是否仍在有效区间。同时提及ZOJ 2859题——Matrix Searching,作为应用场景示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意bit数组存放的是一个区间的最值。更新最值的时候要传递更新。查找的时候也要注意。如果已经不是在一个区间段上了,应该和num[]比。

program zhongcheng2;
var n,m,i,p,x,y:longint;
    a:array[0..100000]of longint;
    bit:array[0..100000]of longint;
function min(a,b:longint):longint;
begin
 if a<b then min:=a else min:=b;
end;
function lowbit(x:longint):longint;
begin
 lowbit:=x and (-x);
end;
function query(x,y:longint):longint;//查询
var ans:longint;
begin
 ans:=a[y];
 while x<=y do
  begin
   if y-lowbit(y)+1>=x then
    begin
     ans:=min(ans,bit[y]);
     y:=y-lowbit(y);
    end
   else
    begin
     ans:=min(ans,a[y]);
     y:=y-1;
    end;
  end;
 query:=ans;
end;

procedure inset(x,y:longint);//插入
begin
 while x<=m do
  begin
   bit[x]:=min(bit[x],y);
   x:=x+lowbit(x);
  end;
end;
procedure modify(x,y:longint);//修改
var j:longint;
begin
 a[x]:=y;
 while x<=m do
  begin
   bit[x]:=a[x];//防止bit中存的是以前的值,写a[x]是因为可能极端情况y不更新x:y在孩子中在孩子的父亲管辖的节点中
   j:=1;
   while j<lowbit(x) do
    begin
     bit[x]:=min(bit[x],bit[x-j]); //bit[x]表示x-lowbit(x)+1~x的最小值
     j:=j*2;//x的二进制后有几个0,x就分多少层,j就乘几次
    end;
   x:=x+lowbit(x);//该节点可能更新父亲
  end;
end;
begin
 read(m,n);
 fillchar(bit,sizeof(bit),127);//这里很神奇的只能填127最大
 for i:=1 to m do
  begin
   read(a[i]);
   inset(i,a[i]);
  end;
 for i:=1 to n do
  begin
   read(p,x,y);
   if p=1 then
    write(query(x,y),' ')
   else
    modify(x,y);
  end;
end.


还有ZOJ Problem Set - 2859Matrix Searching

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1859


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值