用树状数组求区间最值

来源:互联网 发布:windows route delete 编辑:程序博客网 时间:2024/06/05 10:38

注意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


0 0
原创粉丝点击