#include<iostream>
#include<cstring>
#define MAX 100
#define MAXN 1000
using namespace std;
//struct seg_tree
//{
// seg_tree *left, *right;
//};
void ini(int node, int b, int e, int *M, int *A)
{
if(b == e)
M[node] = A[b];
else
{
ini(2 * node, b, (b + e) / 2, M, A);
ini(2 * node + 1, (b + e) / 2 + 1, e, M, A);
//找出区间中的最小值
if(M[2 * node] <= M[2 * node + 1])
M[node] = M[2 * node];
else
M[node] = M[2 * node + 1];
}
}
int search(int node, int b, int e, int *M, int i, int j)
{
int p1, p2;
if(i > e || j < b)
return -1;
else if(b >= i && e <= j)
return M[node];
p1 = search(2 * node, b, (b + e) / 2, M, A, i, j);
p2 = search(2 * node + 1, (b + e) / 2 + 1, e, M, A, i, j);
if(p1 == -1)
return p2;
else if(p2 == -1)
return p1;
else
return (p2 > p1? p1 : p2);
}
int main()
{
int n;
int a[MAX];
int M[MAXN];
int start, end;
cin >> n;
for(int i = 0; i < n; ++ i)
cin >> a[i];
memset(M, -1, sizeof(M));
ini(1, 0, n - 1, M, a);
while(cin >> start >> end)
{
cout << start << "和" << end << "之间的最小值是:"
<< search(1, 0, n - 1, M, start, end) << endl;
}
return 0;
}
大学生活过得很快,一转眼已经是大二的学生了,这时候才发现自己和各路大神的差距有多大。所以暗暗地下决心要好好学习,于是乎决定做acm。
但是发现acm真的好难,前几天做题发现不会查一下是线段树,看了一下网上的代码理解了以后自己写了一个。做了一些小改变吧。
这个主要是用线段树解决RMQ问题,也就是一个局部的最大最小值问题,我的代码解决的是最小值问题。
一定要继续努力下去,不能放弃!加油!
这是我参考的微博:点击打开链接,写得不错可以看一下。