【Vijos1514】天才的记忆
2015-08-02 00:06
183 查看
【Description】
从前有个人名叫W and N and B,他有着天才般的记忆力,他珍藏了许多许多的宝藏。在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以继承他的宝藏。题目是这样的:给你一大串数字(编号为1到N,大小可不一定哦!),在你看过一遍之后,它便消失在你面前,随后问题就出现了,给你M个询问,每次询问就给你两个数字A,B,要求你瞬间就说出属于A到B这段区间内的最大数。一天,一位美丽的姐姐从天上飞过,看到这个问题,感到很有意思(主要是据说那个宝藏里面藏着一种美容水,喝了可以让这美丽的姐姐更加迷人),于是她就竭尽全力想解决这个问题。BUT,她每次都以失败告终,因为这数字的个数是在太多了!于是她请天才的你帮他解决。如果你帮她解决了这个问题,可是会得到很多甜头的哦!【Input】
一个整数N表示数字的个数,接下来一行为N个数。第三行读入一个M,表示你看完那串数后需要被提问的次数,接下来M行,每行都有两个整数A,B。【Output】
输出共M行,每行输出一个数。【Sample Input】
6 34 1 8 123 3 2 4 1 2 1 5 3 4 2 3
【Sample Output】
34 123 123 8
【题解】
题目要求求出区间内最大值,很容易想到RMQ问题,用ST算法即可。参考代码如下:
var n,m:longint; a:array[0..300100] of longint; f:array[0..300100,0..20] of longint; function max(x,y:longint):longint; begin if x>y then exit(x) else exit(y); end; procedure init; var i,j:longint; begin readln(m); for i:=1 to m do read(a[i]); readln(n); end; procedure prep; var i,j:longint; begin for i:=1 to m do f[i,0]:=a[i]; for i:=1 to trunc(ln(m)/ln(2)) do for j:=1 to (m-(1 shl i)+1) do f[j,i]:=max(f[j,i-1],f[j+1 shl (i-1),i-1]); end; function ask(l,r:longint):longint; var tmp:longint; begin tmp:=trunc(ln(r-l+1)/ln(2)); exit(max(f[l,tmp],f[r-(1 shl tmp)+1,tmp])); end; procedure main; var l,r:longint; begin while (n>0) do begin readln(l,r); writeln(ask(l,r)); dec(n); end; end; begin init; prep; main; end.
相关文章推荐
- CS224d lecture 9札记
- [转]GFS架构分析
- uva11082 最大流和网络流建模
- TIANKENG’s restaurant
- 机试算法讲解: 第57题 位运算
- Android远程服务三:android AIDL远程服务个人归纳总结
- 01_JNI是什么,为什么使用,怎么用JNI,Cygwin环境变量配置,NDK案例(使用Java调用C代码),javah命令使用
- 01_JNI是什么,为什么使用,怎么用JNI,Cygwin环境变量配置,NDK案例(使用Java调用C代码),javah命令使用
- [LeetCode]Isomorphic Strings
- 机试算法讲解: 第58题 输入外挂
- 机试算法讲解: 第56题 多重背包之一起支援灾区
- 机试算法讲解: 第55题 完全背包之储蓄罐最少放了多少钱
- 基于双线性配对的密码学算法
- java下载网络文件代码
- WebMagic/JMX&爬虫监控
- Linux的SOCKET编程详解
- httpclient4.2.1 连接池
- 机试算法讲解: 第54题 0-1背包之如何采药
- PHP 7新特性介绍
- CentOS下将MySQL 5.1升级到MySQL 5.5的步骤