AcWing 1270 数列区间最大值 题解 (蓝桥杯 线段树)

AcWing 1270 数列区间最大值 题解 (蓝桥杯 线段树),第1张

注意写代码的时候上下限要定的大一些,避免数据比较夸张,最好直接用long long进行运算
原题

#include

using namespace std;

#define int long long

const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f3f;

int n, m;
struct Node{
	int l, r;
	int maxn;
}tr[N * 4];
int w[N];

void push_up(int u){
	tr[u].maxn = max(tr[u << 1].maxn, tr[u << 1 | 1].maxn);
}

void build(int u, int l, int r){
	//此时tr[]还没哟值,所以不能用于判断 
	if(l == r) tr[u] = {l, r, w[r]};
	else{
		tr[u] = {l, r};
		int mid = l + r >> 1;
		//建树的时候不用判断下一层的边界,直接建树即可 
		build(u << 1, l, mid);
		build(u << 1 | 1, mid + 1, r);
		push_up(u);
	}
}

int query(int u, int l, int r){
	if(l <= tr[u].l && r >= tr[u].r) return tr[u].maxn;	
	int res = -INF;
	int mid = tr[u].l + tr[u].r >> 1;
	if(l <= mid) res = max(res, query(u << 1, l, r));
	if(r > mid) res = max(res, query(u << 1 | 1, l, r));	
	return res;	 
}

signed main()
{
	scanf("%lld %lld", &n, &m);
	for(int i = 1; i <= n; i ++ ){
		scanf("%lld", &w[i]);
	}
	
	build(1, 1, n);
	
	while(m -- ){
		int a, b;
		scanf("%lld%lld", &a, &b);
		printf("%lld\n", query(1, a, b));
	}
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/562268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存