`

poj 3264

 
阅读更多

题意:Farmer Johnn头牛按照编号顺序排好,第i头牛高度为hei[i],现在给出区间[a,b],问这个区间内的最高的牛和最低的牛相差多高。

 

思路:基础线段树。 静态建树,求区间最大值与最小值之差。跑得要点慢。

代码如下:

 

#include<iostream>
using namespace std;
const int Max = 50005;

struct
{
    int l, r, max, min;
}node[3*Max];
int hei[Max], ma, mi;

int max1(int a, int b)
{
    return a > b ? a : b;
}

int min1(int a, int b)
{
    return a < b ? a : b;
}

void BuildTree(int left, int right, int u)
{          //  建树。
    node[u].l = left;
    node[u].r = right;
    if(left == right)
	{
        node[u].max = node[u].min = hei[left];
        return;
    }
    BuildTree(left, (left+right)>>1, u<<1);
    BuildTree(((left+right)>>1)+1, right, (u<<1)+1);
    node[u].max = max1(node[u<<1].max, node[(u<<1)+1].max);
    node[u].min = min1(node[u<<1].min, node[(u<<1)+1].min);
}

void query(int left, int right, int u)
{              //  查询。
    if(node[u].l == left && node[u].r == right)
	{
        ma = max1(ma, node[u].max);
        mi = min1(mi, node[u].min);
        return;
    }
    if(left <= node[u<<1].r)
	{
        int r = min1(right, node[u<<1].r);
        query(left, r, u<<1);
    }
    if(right >= node[(u<<1)+1].l)
	{
        int l = max1(left, node[(u<<1)+1].l);
        query(l, right, (u<<1)+1);
    }
}

int main()
{
    int n, m, i;
    scanf("%d%d", &n, &m);
    for(i = 1; i <= n; i ++)
        scanf("%d", &hei[i]);
    BuildTree(1, n, 1);
    while(m--)
	{
        int a, b;
        scanf("%d%d", &a, &b);
        ma = 0;
        mi = 1000000;
        query(a, b, 1);
        cout << ma - mi << endl;
    }
    return 0;
}

 

 

分享到:
评论

相关推荐

    线段树练习POJ 3264

    在本题“POJ 3264”中,我们可能面临的是一个区间最值或者区间求和的计算任务。线段树的基本思想是将数组或序列分成多个部分(通常是二分),每个部分对应线段树的一个节点,通过节点间的合并操作,快速获取区间信息...

    poj题目分类

    * RMQ:例如 poj3264、poj3368。 * 并查集的高级应用:例如 poj1703、poj2492。 * KMP 算法:例如 poj1961、poj2406。 4. 搜索: * 最优化剪枝和可行性剪枝。 * 搜索的技巧和优化:例如 poj3411、poj1724。 *...

    poj训练计划.doc

    - RMQ(区间查询):如`poj3264, poj3368`。 - 并查集的高级应用:如`poj1703, poj2492`。 - **搜索** - 最优化剪枝和可行性剪枝:如`poj3411, poj1724`。 - **动态规划** - 复杂的动态规划:如`poj1191, poj...

    acm训练计划(poj的题)

    - (poj3264, poj3368):如何快速获取指定区间内的最大值。 5. **后缀数组/后缀自动机**: - (poj1703, 2492):用于文本检索的强大工具。 6. **KMP算法**: - (poj1961, poj2406):高效的字符串匹配算法。 ### ...

    经典 的POJ 分类

    - POJ 3264、POJ 3368:树状数组的构造与更新。 #### 字符串匹配 - **题目示例**: - POJ 1961、POJ 2406:KMP算法的应用。 ### 其他问题 #### 贪心算法 - **题目示例**: - POJ 3411、POJ 1724:贪心策略的...

    acm新手刷题攻略之poj

    - 推荐题目:[poj3264](https://vjudge.net/problem/POJ-3264)、[poj3368](https://vjudge.net/problem/POJ-3368) - 区间查询问题通常涉及线段树或树状数组等数据结构。 5. **字符串匹配** - 推荐题目:[poj1961...

    ACM-POJ 算法训练指南

    4. **区间查询**:如RMQ问题(poj3264, poj3368)。 5. **字符串匹配**:如KMP算法(poj1961, poj2406)。 ### 十三、进阶算法 1. **组合优化**:如割平面法、分支定界法等(poj3411, poj1724)。 2. **近似算法**...

    ACMer需要掌握的算法讲解 (2).docx

    * RMQ:POJ3264、POJ3368 * 并查集的高级应用:POJ1703、POJ2492 * KMP算法:POJ1961、POJ2406 * 左偏树(可合并堆) 四、搜索 * 最优化剪枝和可行性剪枝 * 较为复杂的动态规划:POJ1191、POJ1054、POJ3280、POJ...

    ACM常用算法及其相应的练习题.docx

    ACM常用算法及其相应的练习题 ... + poj3264, poj3368 * 并查集的高级应用 + poj1703, poj2492 * KMP算法 + poj1961, poj2406 四、搜索 * 最优化剪枝和可行性剪枝 * 搜索的技巧和优化 + poj3411, poj1724

    ACMer需要掌握的算法讲解.docx

    1. RMQ(poj3264, poj3368) 2. 并查集的高级应用(poj1703, poj2492) 3. KMP 算法(poj1961, poj2406) 4. 左偏树(可合并堆) 四、搜索 1. 最优化剪枝和可行性剪枝 2. 较为复杂的动态规划(如动态规划解特别的...

    ACM 题型

    - 示例题目:poj3264, poj3368 - **后缀数组** - 示例题目:poj1703, poj2492 - **KMP算法** - 示例题目:poj1961, poj2406 #### 高级动态规划 1. **矩阵乘法** - 示例题目:poj1191, poj1054, poj3280, poj...

    LCA与RMQ相关题解1

    在POJ3264中,要求找出牛的身高差的最大值,通过构建RMQ数据结构,可以快速找到区间内的最大值和最小值,两者相减即可得到身高差。RMQ可以通过各种方法实现,如ST(Sqrt-Decomposition)分解、Sparse Table或Fenwick...

    算法训练方案详解

    - **示例题目**: POJ 3267, POJ 1836, POJ 1260, POJ 2533, POJ 3176, POJ 1080, POJ 1159 - **注意事项**: 理解每种模型的状态定义和转移方程。 #### 六、数学 **1. 组合数学** - **定义**: 研究组合结构的...

    ACM算法总结--最新总结的ACM算法

    4. **RMQ(Range Minimum Query)**(如poj3264, poj3368):快速查询区间内的最小值,适用于数据压缩、图像处理等领域。 5. **后缀树/后缀数组**(如poj1703, 2492):用于字符串的高效处理,适用于文本索引、生物...

    ACM中的RMQ和LCA问题

    POJ 3264 Balanced Lineup和POJ 2823 Sliding Window问题则分别展示了RMQ问题在不同场景下的应用。 总的来说,RMQ和LCA是ACM中重要且实用的数据结构问题,它们涉及到动态规划、线段树、Sparse Table、并查集等多种...

    ACM数据结构之树状数组和线段树

    以题目 POJ3264 BalancedLineup 为例,该题目要求多次求任一区间 Ai–Aj 中最大数和最小数的差。使用线段树来解决这个问题是非常合适的。 1. **树节点结构设计**:每个节点除了保存区间起点和终点之外,还需要保存...

    线段树题目

    - **POJ 3264**:简单的线段树题目,需要求解区间内的最大值和最小值。这种问题通常只需要在线段树的节点中维护最大值和最小值即可。 - **POJ 1151**:结合了线段树和离散化的技巧来求解矩形面积的并集。这需要对...

    树状数组(Binary Indexed Tree)

    6. **POJ3264:维护区间最值** - **题意**:给定一个数组,支持区间查询最大值和最小值的操作。 - **解法**:可以考虑使用树状数组来维护区间内的最值,通过低比特操作实现高效更新和查询。 7. **二维树状数组 ...

    poj pku 解题报告

    1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1011 1012 1013 1014 ...3264 3267 3273 3275 3277 3278 3279 3280 3295 3297 3302 3303 3311 3312 3321 3325 3348 3349 3355 3356 3357 3368 3372 3386 3400 3421 ...

Global site tag (gtag.js) - Google Analytics