POJ 3264 RMQ

简介: 题意就是让你求区间最大和最小值的差值。这题可以用线段树,也可以用Tarjan 的Sparse Table算法(参考刘汝佳训练指南197),这里我用了ST算法,还有要说明的是题目描述的数据范围是不准确的如果你数组开比50000大一点点的话是会RE的。

题意就是让你求区间最大和最小值的差值。

这题可以用线段树,也可以用Tarjan 的Sparse Table算法(参考刘汝佳训练指南197),这里我用了ST算法,还有要说明的是题目描述的数据范围是不准确的如果你数组开比50000大一点点的话是会RE的。

代码:

//poj 3263 RMQ
//2013-07-30-21.39
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 100005;
int dmax[maxn][30];
int dmin[maxn][30];
int a[maxn];
void init(int n)
{
    for (int i = 1; i <= n; i++)
    {
        dmax[i][0] = a[i];
        dmin[i][0] = a[i];
    }
    for (int j = 1; (1<<j) <= n; j++)
    {
        for (int i = 1; i + j - 1 <= n; i++)
        {
            dmax[i][j] = max(dmax[i][j-1], dmax[i+(1<<(j-1))][j-1]);
            dmin[i][j] = min(dmin[i][j-1], dmin[i+(1<<(j-1))][j-1]);
        }
    }
}
int RMQ(int l, int r)
{
    int k = 0;
    while ((1<<(k+1)) <= r-l+1) k++;
    return (max(dmax[l][k], dmax[r-(1<<k)+1][k]) - min(dmin[l][k], dmin[r-(1<<k)+1][k]));
}
int main()
{
    int n, q;
    int l, r;
    while (scanf("%d %d", &n, &q) != EOF)
    {
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        init(n);
        while (q--)
        {
            scanf("%d %d", &l, &r);
            printf("%d\n", RMQ(l, r));
        }
    }
    return 0;
}
目录
相关文章
|
3月前
poj-1611-The Suspects
poj-1611-The Suspects
18 0
|
存储
poj 3664
http://poj.org/problem?id=3664 进行两轮选举,第一轮选前n进入第二轮,第二轮选最高   #include #include using namespace std; struct vote { int a,b; int c; ...
721 0
|
算法 数据建模 机器学习/深度学习
|
人工智能 vr&ar
|
人工智能 机器学习/深度学习
poj 2912 Rochambeau
点击打开链接poj 2912 思路: 带权并查集 分析: 1 有n个小孩玩游戏,里面有一个入是裁判,剩下的人分为三组。现在我们既不知道裁判是谁也不知道分组的情况。
941 0
poj 2337 Catenyms
点击打开链接poj2377 思路: 并查集+排序+欧拉道路 分析: 1 题目要求的是,是否可以组成欧拉道路并且输出字典序最小的方案 2 和别的题目不一样的是这一题的输出是最小的字典序,所以这里面是一个难点,那么我们应该怎么做呢?其实我们只要对输入的n个单词进行从小到达排序即可 3 然后我们先去判断该有向图是否是单连通的 4 我们去判断是否最多只有两个点的入度不等与出度,其余所有点的出度等于入度 5 如果都满足的话,进行dfs。
849 0