题意:Farmer John有n头牛按照编号顺序排好,第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”中,我们可能面临的是一个区间最值或者区间求和的计算任务。线段树的基本思想是将数组或序列分成多个部分(通常是二分),每个部分对应线段树的一个节点,通过节点间的合并操作,快速获取区间信息...
* RMQ:例如 poj3264、poj3368。 * 并查集的高级应用:例如 poj1703、poj2492。 * KMP 算法:例如 poj1961、poj2406。 4. 搜索: * 最优化剪枝和可行性剪枝。 * 搜索的技巧和优化:例如 poj3411、poj1724。 *...
- RMQ(区间查询):如`poj3264, poj3368`。 - 并查集的高级应用:如`poj1703, poj2492`。 - **搜索** - 最优化剪枝和可行性剪枝:如`poj3411, poj1724`。 - **动态规划** - 复杂的动态规划:如`poj1191, poj...
- (poj3264, poj3368):如何快速获取指定区间内的最大值。 5. **后缀数组/后缀自动机**: - (poj1703, 2492):用于文本检索的强大工具。 6. **KMP算法**: - (poj1961, poj2406):高效的字符串匹配算法。 ### ...
- POJ 3264、POJ 3368:树状数组的构造与更新。 #### 字符串匹配 - **题目示例**: - POJ 1961、POJ 2406:KMP算法的应用。 ### 其他问题 #### 贪心算法 - **题目示例**: - POJ 3411、POJ 1724:贪心策略的...
- 推荐题目:[poj3264](https://vjudge.net/problem/POJ-3264)、[poj3368](https://vjudge.net/problem/POJ-3368) - 区间查询问题通常涉及线段树或树状数组等数据结构。 5. **字符串匹配** - 推荐题目:[poj1961...
4. **区间查询**:如RMQ问题(poj3264, poj3368)。 5. **字符串匹配**:如KMP算法(poj1961, poj2406)。 ### 十三、进阶算法 1. **组合优化**:如割平面法、分支定界法等(poj3411, poj1724)。 2. **近似算法**...
* RMQ:POJ3264、POJ3368 * 并查集的高级应用:POJ1703、POJ2492 * KMP算法:POJ1961、POJ2406 * 左偏树(可合并堆) 四、搜索 * 最优化剪枝和可行性剪枝 * 较为复杂的动态规划:POJ1191、POJ1054、POJ3280、POJ...
ACM常用算法及其相应的练习题 ... + poj3264, poj3368 * 并查集的高级应用 + poj1703, poj2492 * KMP算法 + poj1961, poj2406 四、搜索 * 最优化剪枝和可行性剪枝 * 搜索的技巧和优化 + poj3411, poj1724
1. RMQ(poj3264, poj3368) 2. 并查集的高级应用(poj1703, poj2492) 3. KMP 算法(poj1961, poj2406) 4. 左偏树(可合并堆) 四、搜索 1. 最优化剪枝和可行性剪枝 2. 较为复杂的动态规划(如动态规划解特别的...
- 示例题目:poj3264, poj3368 - **后缀数组** - 示例题目:poj1703, poj2492 - **KMP算法** - 示例题目:poj1961, poj2406 #### 高级动态规划 1. **矩阵乘法** - 示例题目:poj1191, poj1054, poj3280, poj...
在POJ3264中,要求找出牛的身高差的最大值,通过构建RMQ数据结构,可以快速找到区间内的最大值和最小值,两者相减即可得到身高差。RMQ可以通过各种方法实现,如ST(Sqrt-Decomposition)分解、Sparse Table或Fenwick...
- **示例题目**: POJ 3267, POJ 1836, POJ 1260, POJ 2533, POJ 3176, POJ 1080, POJ 1159 - **注意事项**: 理解每种模型的状态定义和转移方程。 #### 六、数学 **1. 组合数学** - **定义**: 研究组合结构的...
4. **RMQ(Range Minimum Query)**(如poj3264, poj3368):快速查询区间内的最小值,适用于数据压缩、图像处理等领域。 5. **后缀树/后缀数组**(如poj1703, 2492):用于字符串的高效处理,适用于文本索引、生物...
POJ 3264 Balanced Lineup和POJ 2823 Sliding Window问题则分别展示了RMQ问题在不同场景下的应用。 总的来说,RMQ和LCA是ACM中重要且实用的数据结构问题,它们涉及到动态规划、线段树、Sparse Table、并查集等多种...
以题目 POJ3264 BalancedLineup 为例,该题目要求多次求任一区间 Ai–Aj 中最大数和最小数的差。使用线段树来解决这个问题是非常合适的。 1. **树节点结构设计**:每个节点除了保存区间起点和终点之外,还需要保存...
- **POJ 3264**:简单的线段树题目,需要求解区间内的最大值和最小值。这种问题通常只需要在线段树的节点中维护最大值和最小值即可。 - **POJ 1151**:结合了线段树和离散化的技巧来求解矩形面积的并集。这需要对...
6. **POJ3264:维护区间最值** - **题意**:给定一个数组,支持区间查询最大值和最小值的操作。 - **解法**:可以考虑使用树状数组来维护区间内的最值,通过低比特操作实现高效更新和查询。 7. **二维树状数组 ...
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 ...