大佬帮忙看下,用线段树解,第11个点为什么超时
查看原帖
大佬帮忙看下,用线段树解,第11个点为什么超时
609811
accccccc楼主2022/5/15 10:59
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#include <set>
#include <map>
using namespace std;
#define ll long long
#define INF  0x7FFFFFFF
const int N = 1e5+10;
const int M = N*4;
const double eps = 1e-8; 
/*
	线段树求区间最大值 
*/ 
ll a[N];
struct Tree {
	ll l, r;
	ll val;
}t[M];
ll lc(ll k) {
	return k << 1;
}
ll rc(ll k) {
	return k << 1 | 1;
}
inline void push_up(ll k) {
	t[k].val = max(t[lc(k)].val, t[rc(k)].val);
}
inline void buildTree(ll k, ll l, ll r) {
	t[k].l = l, t[k].r = r;
	if(l == r) {
		t[k].val = a[l];
		return;
	}
	ll mid = (l + r) >> 1;
	buildTree(lc(k), l, mid);
	buildTree(rc(k),mid+1, r);
	push_up(k);
}
ll query(ll k, ll l, ll r) {
	if(t[k].l >= l && t[k].r <= r) {
		return t[k].val;
	}
	ll mid = (t[k].l + t[k].r) >> 1;
	ll res = -INF;
	if(l <= mid)
		res = max(res, query(lc(k), l, r));
	if(r > mid)
		res = max(res, query(rc(k), l, r));
	return res;
}
int main() {
//    ios::sync_with_stdio(false); cin.tie(0);
	int n, m;
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
	} 
	buildTree(1,1,n);
	while(m--) {
		ll l, r;
		scanf("%lld%lld",&l,&r);
		printf("%lld\n", query(1,l,r));
	}
	return 0;
}
2022/5/15 10:59
加载中...