给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。

 
例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题)
Input
第1行:1个数N,表示序列的长度。(2 <= N <= 10000)
第2 - N + 1行:每行1个数,对应序列中的元素。(0 <= S[i] <= 10^9)
第N + 2行:1个数Q,表示查询的数量。(2 <= Q <= 10000)
第N + 3 - N + Q + 2行:每行2个数,对应查询的起始编号i和结束编号j。(0 <= i <= j <= N - 1)
Output
共Q行,对应每一个查询区间的最大值。
Input示例
5
1
7
6
3
1
3
0 1
1 3
3 4
Output示例
7
7
3
解:
法一:ST表,算法思路简单,但其实不好写。
 #include <stdio.h>
#include <string.h>
#include <math.h> #define CLR(x) memset(x, 0, sizeof(x))
#define MAX(a,b) (a > b ? a : b) int dp[][]; void ST(int l)
{
for (int i = ; ( << i - ) < l; ++i)
for (int j = ; j + ( << i - ) < l; ++j)
dp[j][i] = MAX(dp[j][i - ], dp[j + ( << (i - ))][i - ]);
} int main()
{
int n;
while (scanf_s("%d", &n) != EOF)
{
int q;
for (int i = ; i < n; ++i) scanf_s("%d", &dp[i][]);
ST(n);
scanf_s("%d", &q);
while (q--)
{
int i, j, k = ;
scanf_s("%d%d", &i, &j);
while (i + ( << k) < j - ( << k) + ) ++k;
printf("%d\n", MAX(dp[i][k], dp[j - ( << k) + ][k]));
}
}
}

法二:按自己想法写的,本来想试试线段树,但感觉更像是树状数组。

 #include <stdio.h>
#include <math.h>
#include <malloc.h> #define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b) int *p, len; void build_tree(int n)
{
len = ;
while (len < n) len <<= ;//len >= n
p = (int *)calloc((len << ), );//0~2*len-1,其中len~2*len-1存放基础数据
for (int i = len; i < n + len; i++) scanf_s("%d", &p[i]);
for (int i = len - ; i > ; i--)
p[i] = MAX(p[i << ], p[i << | ]);
return;
} int Search()
{
int l, r, max = ;
scanf_s("%d%d", &l, &r);
while (l <= r)
{
int i = r - l + , j, temp = ;//i为区域内数据个数。
if (l) j = l & -l;//j为以l为左端点包含数据的个数。0时为0(实为无穷大),需修改。
else j = ;
while ( << (temp + ) < MIN(i, j)) ++temp;//temp=log2(min(i,j))
max = MAX(max, p[l + len >> temp]);
l += ( << temp);
}
return max;
} int main()
{
int n;
while (scanf_s("%d", &n) != EOF)
{
int q;
build_tree(n);
scanf_s("%d", &q);
while (q--)
printf("%d\n", Search());
free(p);
}
return ;
}

(DP ST表 线段树)51NOD 1174 区间中最大的数的更多相关文章

  1. 51nod(1174 区间中最大的数)(ST表模板题)

    1174 区间中最大的数 1.0 秒 131,072.0 KB 0 分 基础题   给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 ...

  2. 51Nod—1174 区间中最大的数 线段树模版

    在大佬们题解的帮助下算是看懂了线段树吧...在这mark下防一手转头就忘. #include<iostream> #include<stdio.h> using namespa ...

  3. 51nod——1174 区间中最大的数(ST)

    题目链接 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数 ...

  4. 51Nod 1174 区间中最大的数

    给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少.   例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...

  5. 51nod 1174 区间中最大的数(送盾题)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. ...

  6. 51Nod 1174 区间中最大的数(RMQ)

    #include <iostream> #include <algorithm> #include <cstring> using namespace std; + ...

  7. 51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径

    51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即 ...

  8. 51nod 1174 1174 区间中最大的数

    题目链接:51nod 1174 1174 区间中最大的数 ST(Sparse Table)算法学习参考博客:http://blog.csdn.net/niushuai666/article/detai ...

  9. 51nod 1593 公园晨跑 | ST表(线段树?)思维题

    51nod 1593 公园晨跑 有一只猴子,他生活在一个环形的公园里.有n棵树围绕着公园.第i棵树和第i+1棵树之间的距离是 di ,而第n棵树和第一棵树之间的距离是 dn .第i棵树的高度是 hi ...

随机推荐

  1. SyntaxError: expected expression, got '<'异常错误

    引入jQuery文件,浏览器报SyntaxError: expected expression, got '<'错误,但是jQuery文件可以在网络一栏看到,最后检查是springMVC定义的拦 ...

  2. Java简单实验--关于课后提到的java重载函数的简单分析

    根据这一小段代码,获得了以下的测试截图: 简单分析:根据输出结果,判断这段代码用到了两个不同的函数方法,输出的不止有double类型的数,还有整型的数. 又根据类中的定义情况,square是根据判断传 ...

  3. 【Perl】perl正则表达式中的元字符、转义字符、量词及匹配方式

    Linux平台上被广泛使用的正则表达式库PCRE - Perl-compatible regular expressions,从其名字即可知道,PCRE提供的是一套与Perl中相兼容的正则表达式. 元 ...

  4. windows上安装mysql

    安装mysql后 命令行闪退 查看服务 也没有MySQL服务启动 你安装了mysql没有,没有就先安装,安装好mysql以后,在bin目录下有个mysqld.exe,运行这个程序就可以添加mysql服 ...

  5. Java的变量类型

    以下内容引用自http://wiki.jikexueyuan.com/project/java/variable-types.html: 一个变量提供了程序可以操作的命名存储.Java中的每个变量都有 ...

  6. Import Items – Validation Multiple Languages Description

    ð  提交标准请求创建和更新物料,因语言环境与处理次序方式等因素,造成物料中英(更多语言)描述和长描述混乱刷新. 症状: >>> Submit Standard Open Inter ...

  7. jenkins的代理设置,方便下载插件

    jenkins在下载插件的时候,总是网络不通,需要设置代理跨越长城 java.net.SocketTimeoutException: connect timed out Caused: java.ne ...

  8. 浅谈python中的“ ==” 与“ is”、还有cmp

    总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...

  9. centos6.5 (linux) 禁用模块 IPV6模块的方法

    装完centos后,默认开启了一些模块.可是有些模块并非我们必须的.比方眼下尚未在中国普及的IPV6 怎样关闭IPV6呢 以下介绍的方法,也能够在关闭其它模块的时候使用 第一步: 查找模块名称 使用命 ...

  10. ADO.NET(OleDb)读取Excel表格时的一个BUG

    如果我们有例如以下一个Excel表格:    如今要使用C#程序读取其内容: using System;  using System.Data.OleDb;    namespace Skyiv.Be ...