线段树
来源:互联网 发布:suse12 linux 网卡配置 编辑:程序博客网 时间:2024/06/05 04:24
首先,线段树是一棵“树”,而且是一棵完全二叉树。同时,“线段”两字反映出线段树的另一个特点:每个节点表示的是一个“线段”,或者说是一个区间。事实上,一棵线段树的根节点表示的是“整体”的区间,而它的左右子树也是一棵线段树,分别表示的是这个区间的左半边和右半边。
在此我们可以举一个例子来说明线段树通常的构造方法,以RMQ问题为例:
有N个数排成一排,每次询问某一段中的最小数。
构造的时候,让根节点表示区间[0,N-1],即所有N个数所组成的一个区间,然后,把区间分成两半,分别由左右子树表示。不难证明,这样的线段树的节点数只有2N-1个,是O(N)级别的.
例题:
最大值
Max.pas
【题目描述】
在N(1<=N<=100000)个数A1…An组成的序列上进行M(1<=M<=100000)次操作,操作有两种:
(1)1 x y:表示修改A[x]为y;
(1)2 x y:询问x到y之间的最大值。
【输入】
第一行输入N(1<=N<=100000),表示序列的长度,接下来N行输入原始序列;接下来一行输入M(1<=M<=100000)表示操作的次数,接下来M行,每行为1 x y或2 x y
【输出】
对于每个操作(2)输出对应的答案。
【样例输入】
5
1
2
3
4
5
3
2 1 4
1 3 5
2 2 4
【样例输出】
4
5
【限制】
保证序列中的所有的数都在longint范围内
标程:
uses math;var n,i,j,kind,x,y,m:longint; a,f:array[0..300000]of longint;procedure tree(v,l,r:longint);//建树var mid:longint;begin mid:=(l+r) div 2; if l<r then begin tree(v*2,l,mid); tree(v*2+1,mid+1,r); end else begin f[v]:=a[l]; exit; end; f[v]:=max(f[v*2],f[v*2+1]);end;procedure change(v,l,r,x,y:longint);//转换var mid:longint;begin mid:=(l+r) div 2; if l=r then begin f[v]:=y; exit; end; if x<=mid then change(v*2,l,mid,x,y) else change(v*2+1,mid+1,r,x,y); f[v]:=max(f[v*2],f[v*2+1])end;function find(v,l,r,x,y:longint):longint;//找答案var mid:longint;begin mid:=(l+r) div 2; if (x=l)and(y=r) then exit(f[v]); if (x<=mid)and(y<=mid) then exit(find(v*2,l,mid,x,y)); if (x<=mid)and(y>mid) then exit(max(find(v*2,l,mid,x,mid),find(v*2+1,mid+1,r,mid+1,y))); if (x>mid)and(y>mid) then exit(find(v*2+1,mid+1,r,x,y));end;begin readln(n); for i:=1 to n do readln(a[i]); tree(1,1,n); readln(m); for i:=1 to m do begin readln(kind,x,y); if kind=1 then change(1,1,n,x,y) else writeln(find(1,1,n,x,y)); end;end.
0 0
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- spring + mybatis配置多个数据源
- android中的 Otto使用
- ftp身份认证时登录框反复弹出以及ftp常用配置
- Position属性四个值:static、fixed、absolute和relative的区别和用法
- Android卡片布局的两种实现方式
- 线段树
- win7guest账户开启方法
- 历届试题 回文数字
- Consul,在路上
- Libevent学习之处理可读 and 可写事件
- 【数据结构】-线性表-链表 熟练度max=4(split)
- mybaits错误解决:There is no getter for property named 'id' in class 'java.lang.String'
- 彻底理解java语言的线程安全volatile用法
- c指针学习