The Water Problem(RMQ)
2015-09-14 19:43
357 查看
The Water Problem
[align=center][/align][align=center][/align]
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1634 Accepted Submission(s): 1245
[align=left]点击打开链接[/align]
Problem Description
In Land waterless, water is a very limited resource. People always fight for the biggest source of water. Given a sequence of water sources with
a1,a2,a3,...,an
representing the size of the water source. Given a set of queries each containing
2
integers l
and r,
please find out the biggest water source between al
and ar.
[align=left]Input[/align]
First you are given an integer
T(T≤10)
indicating the number of test cases. For each test case, there is a number
n(0≤n≤1000)
on a line representing the number of water sources. n
integers follow, respectively a1,a2,a3,...,an,
and each integer is in {1,...,106}.
On the next line, there is a number q(0≤q≤1000)
representing the number of queries. After that, there will be q
lines with two integers l
and r(1≤l≤r≤n)
indicating the range of which you should find out the biggest water source.
Output
[align=left]For each query, output an integer representing the size of the biggest water source.[/align]
[align=left]Sample Input[/align]
3
1
100
1
1 1
5
1 2 3 4 5
5
1 2
1 3
2 4
3 4
3 5
3
1 999999 1
4
1 1
1 2
2 3
3 3
Sample Output
100
2
3
4
4
5
1
999999
999999
1
题源:2015亚洲赛区长春网络赛
题目分析:区间求最大值。RMQ,模板题。
AC代码:
#include <iostream> #include <cmath> #include <cstdlib> #include <cstdio> #include <cstring> #define maxn 10005 using namespace std; int maxSum[maxn][20]; void RMQ(int num) //预处理->O(nlogn) { for(int j = 1;j < 20;j++) { for(int i = 1;i <= num;i++) { if((i + (1 << j) - 1) <= num)//区间长度要满足总数条件 { maxSum[i][j] = max(maxSum[i][j - 1],maxSum[i + (1 << (j - 1))][j - 1]); } } } } int main() { int t; scanf("%d",&t); while(t--) { int num,query; int src,des; scanf("%d",&num); for(int i = 1;i <= num;i++) { scanf("%d",&maxSum[i][0]);//表示从第i个数起连续2^0(1)个数,即就是这第i个数 } RMQ(num); scanf("%d",&query); while(query--)//O(1)查询 { scanf("%d %d",&src,&des); int k = (int)(log(des - src + 1.0) / log(2.0));//中间位置 int ansMax = max(maxSum[src][k],maxSum[des - (1 << k) + 1][k]); printf("%d\n",ansMax); } } return 0; }
相关文章推荐
- 整数划分问题
- 【Java EE 学习 43】【SVN版本控制工具】【CVS版本控制工具】
- Java IO读写大文件的几种方式及测试
- 我是如何自学Android,资料分享(2015 版)
- 矩阵乘法
- 异常处理案例分析
- poj3913 Gnome Sequencing
- JSON 序列化 和 JSON 反序列化
- 【Java EE 学习 42】【Weblogic】【Ant】
- [转]实现Hive数据同步更新的shell脚本
- 磁盘IO过高时的处理办法
- 测试工具及使用汇总
- 01背包
- Unity物理引擎:Colliders简介
- Google指令-----Google搜索实践
- Android 中使用rawquery方法查询指定数据的一些方法总结
- C++Primer第五版 5.4.2节练习
- 数据结构(基本运算验证性实践路线)——顺序表
- 南阳理工NYOJ 975关于521
- Linux-Ubuntu 和 安装 genymotion 的一些问题和一些命令