用树状数组求区间最值
来源:互联网 发布: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
- 用树状数组求区间最值
- 树状数组求区间最值(转载)
- 树状数组求区间最值
- 树状数组求区间最值
- hdu1754 求区间最值 线段树 树状数组
- 树状数组求区间最值(RMQ)
- poj3264 树状数组维护区间最值
- 【hdu1754】树状数组 区间最值
- HDU 1754 I Hate It 树状数组求区间最值
- HDU 1754 I Hate It(树状数组求区间最值)
- 爱爬山的小Z(树状数组求区间最值)
- 树状数组求带单点修改区间最值问题 HDU 1754:I Hate It
- 树状数组求区间最大值
- 树状数组求区间和
- 树状数组求区间极值
- 树状数组求区间极值
- 树状数组求区间和
- 树状数组求区间最大值
- C++-虚函数,多态性,纯虚函数,抽象类
- hdu 2570 迷瘴
- poj3461Oulipo
- hdu 3038 How Many Answers Are Wrong(并查集)
- 暑期个人赛--第七场--C
- 用树状数组求区间最值
- C++-函数覆盖和隐藏
- 为什么要定义接口?
- C++-类的操作
- 30天自制操作系统之第11天 制作窗口
- 数论之欧几里得算法hdu1019
- hdu 1950 Bridging signals
- poj2352 树状数组
- 我书读的是少,不代表你就可以骗我……