线段树的简单应用

#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问题,也就是一个局部的最大最小值问题,我的代码解决的是最小值问题。

   一定要继续努力下去,不能放弃!加油!

  这是我参考的微博:点击打开链接,写得不错可以看一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值