《算法竞赛-训练指南》第三章-RMQ
2013-09-02 22:12
387 查看
RMQ求区间内的最大值,最小值。平常的区间更新算法都不很好求,当然线段树可以。马上写线段树的算法。
具体的讲解都在代码中:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
using namespace std;
const int MAXN = 1000 + 11;
int A[MAXN];
int N;
int d[MAXN][22];
void RMQ_init() //请一定注意RMQ的值的范围是从1-N;
{
for (int i = 1; i <= N; i++) //这是设置边界条件,因为会用到j等于0的时候,当j = 1的时候j - 1 就等于0;
{
d[i][0] = A[i];
}
for (int j = 1; (1 << j) <= N; j++)
{
for (int i = 1; i + (1 << j) - 1 <= N; i++) //我就觉得书上描述的是错的,就应该是这样的。
{
d[i][j] = min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]); //这就是dp的递归求解。
}
}
}
int RMQ(int L, int R) //查询的时候首先的就是确定最近的2^j满足R-L + 1的范围,然后就可以求出答案,当然求最大值也是一样。
{
int k = 0;
while ((1 << (k + 1)) <= R - L + 1)
{
k++;
}
return min(d[L][k], d[R - (1 << k) + 1][k]);
}
int main()
{
while (scanf("%d", &N) != EOF)
{
for (int i = 1; i <= N; i++)
{
scanf("%d", &A[i]);
}
RMQ_init();
int ans = RMQ(1, N);
printf("%d\n", ans);
}
system("pause");
return 0;
}
具体的讲解都在代码中:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
using namespace std;
const int MAXN = 1000 + 11;
int A[MAXN];
int N;
int d[MAXN][22];
void RMQ_init() //请一定注意RMQ的值的范围是从1-N;
{
for (int i = 1; i <= N; i++) //这是设置边界条件,因为会用到j等于0的时候,当j = 1的时候j - 1 就等于0;
{
d[i][0] = A[i];
}
for (int j = 1; (1 << j) <= N; j++)
{
for (int i = 1; i + (1 << j) - 1 <= N; i++) //我就觉得书上描述的是错的,就应该是这样的。
{
d[i][j] = min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]); //这就是dp的递归求解。
}
}
}
int RMQ(int L, int R) //查询的时候首先的就是确定最近的2^j满足R-L + 1的范围,然后就可以求出答案,当然求最大值也是一样。
{
int k = 0;
while ((1 << (k + 1)) <= R - L + 1)
{
k++;
}
return min(d[L][k], d[R - (1 << k) + 1][k]);
}
int main()
{
while (scanf("%d", &N) != EOF)
{
for (int i = 1; i <= N; i++)
{
scanf("%d", &A[i]);
}
RMQ_init();
int ans = RMQ(1, N);
printf("%d\n", ans);
}
system("pause");
return 0;
}
相关文章推荐
- 《算法竞赛-训练指南》第三章-3.6_LA 3027(并查集)
- 《算法竞赛-训练指南》第三章-3.7_LA 3429(树状数组)
- 《算法竞赛-训练指南》第三章-3.1_UVa 11995(STL数据结构运用)
- 《算法竞赛-训练指南》第三章-2.2_UVa 11991
- 《算法竞赛-训练指南》第三章-3.8_UVa 11235
- 《算法竞赛-训练指南》-第三章-Trie
- 《算法竞赛-训练指南》第一章-1.16_LA 3177
- 《算法竞赛-训练指南》第一章-1.24-pre_二维矩阵求最小子矩阵(O(n^3))
- 《算法竞赛-训练指南》第一章-1.25-LA 2965
- 《算法竞赛-训练指南》第二章-2.27_LA 5009
- 算法竞赛入门经典训练指南-P4例题3 分金币问题总结
- 《算法竞赛-训练指南》第一章-1.19_UVa 11549
- 算法竞赛入门经典——训练指南(算法艺术与信息学竞赛)
- 《算法竞赛-训练指南》第一章-1.5_UVa 10881
- 《算法竞赛-训练指南》第一章-1.20_LA 3905
- 《算法竞赛-训练指南》-第二章-2.18_UVa 10294
- 《算法竞赛-训练指南》-第一章-1.10_UVa 11384
- 算法竞赛入门训练指南 exe_1
- 《算法竞赛-训练指南》第一章-1.26_LA 3882
- 《算法竞赛-训练指南》第一章-1.24_pre-一维数组最大连续和