线段树93pts#11TLE求助
查看原帖
线段树93pts#11TLE求助
1029225
314zbl楼主2025/8/4 21:06
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=100009;
const ll inf=1e9;
ll n,m,x[N];
inline ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
struct Segment{
	ll l,r,mx;
} tr[N*4];
inline void build(ll u,ll l,ll r){//建树 
	if(l==r){
		tr[u]=(Segment){l,r,x[l]};//区间内只有一个点 
		return;
	}
	ll m=(l+r)>>1;//二分 
	build((u<<1),l,m);//把左右两子树分别建树 
	build((u<<1)+1,m+1,r);
	tr[u]=(Segment){l,r,max(tr[(u<<1)].mx,tr[(u<<1)+1].mx)};//更新节点信息 
}
inline ll rmq(ll u,ll&l,ll&r){//查询 
	return (r<tr[u].l||l>tr[u].r)?(-inf):((l<=tr[u].l&&r>=tr[u].r)?(tr[u].mx):(max(rmq((u<<1),l,r),rmq((u<<1)+1,l,r))));
}
int main(){
	n=read(),m=read();
	for(ll i=1;i<=n;i=-~i)
		x[i]=read();
	build(1,1,n);
	for(ll i=0;i<m;i=-~i){
		ll l,r;
		l=read(),r=read();
		printf("%lld\n",rmq(1,l,r));
	}
	return 0;
}

网上说的卡常小技巧啥的都用了,但是还是#11 860+ms 求问有没有更好的方法。 玄关

2025/8/4 21:06
加载中...