初识ST算法
登山
问题描述:
有一座延绵不断、跌宕起伏的山,最低处海拔为0米,最高处海拔不超过8848米。从这座山的一端走到另一端的过程中,每走 1 米海拔高度就升高 1 米或者降低 1 米。有 Q 个登山队计划在这座山的不同区段登山,当他们攀到各自区段内的最高峰时,就会插上他们的队旗。请你写一个程序找出他们插旗的高度。
输入说明:
从CLIMB.IN 输入数据。第一行为 N(N≤106 ),表示山两端的跨度。接下来 N+1 行,每行一个非负整数Hi (i=0..N),表示该位置的海拔高度(单位:米),其中 H0=Hn=0。然后是一个正整数Q(Q≤7000),表示登山队的数量。紧跟的Q行,每行两个数Ai和Bi,表示第 i 个登山队攀爬的区段[Ai,Bi],其中0≤Ai≤Bi≤N。
输出说明:
答案输出到CLIMB.OUT,共Q行,每行一个整数,表示第 i 个登山队攀爬区段中最高点的高度。
样例输入:
10
0
1
2
3
2
3
4
3
2
1
0
5
0 10
2 4
3 7
7 9
8 8
样例输出:
4
3
4
3
2
分析:
就是一个比较显然的RMQ问题,
正好刚学的ST算法,来试验一番。
这道题不是完全考算法,
个人认为,有两点注意事项:
1.这个坐标是从0出发的,不要因为做题的惯性不考虑0
2.这个题的数据范围也是较大的,100万,
要是数组开的比较随意就完了。。。
应当用计算器算一下,
开100W*20的数组刚好够用,
(开始随意的就10W*200(惯性),结果最后俩点201了,
然后100W*200,爆内存。。。。)
内存用了82M。。。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | program climb; var i,j,n,m,k,l,q,a,b: longint ; d: array [ 0..1000000 , 0..20 ] of longint ; function max(x,y: longint ): Longint ; begin if x>y then exit(x); exit(y); end ; begin assign(input, 'climb.in' ); reset(input); assign(output, 'climb.out' ); rewrite(output); readln(n); for i:= 0 to n do readln(d[i, 0 ]); for j:= 1 to trunc(ln(n)/ln( 2 )) do for i:= 0 to n- 1 <<j+ 1 do d[i,j]:=max(d[i,j- 1 ],d[i+ 1 <<(j- 1 ),j- 1 ]); readln(q); for i:= 1 to q do begin readln(a,b); k:=trunc(ln(b-a+ 1 )/ln( 2 )); m:=max(d[a,k],d[b- 1 <<k+ 1 ,k]); writeln (m); end ; close(input); close(output); end . |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?