深进的疑问
查看原帖
深进的疑问
688873
amyang楼主2024/9/20 16:45
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5;
ll n,q,a[maxn],max_tree[maxn<<8],min_tree[maxn<<8];
void build(ll o,ll l,ll r){
	if(l==r){
		max_tree[o]=min_tree[o]=a[l];
		return ;
	}
	else if(l>r)return ;
	ll mid=l+r>>1;
	build(o*2,l,mid);
	build(o*2+1,mid+1,r);
	max_tree[o]=max(max_tree[o*2],max_tree[o*2+1]);
	min_tree[o]=min(min_tree[o*2],min_tree[o*2+1]);
}
ll max_find(ll o,ll l,ll r,ll L,ll R){
	if(L<=l&&r<=R)return max_tree[o];
	else if(L>r||l>R)return -(maxn<<8);
	ll mid=l+r>>1;
	return max(max_find(o*2,l,mid,L,R),max_find(o*2+1,mid+1,r,L,R));
}
ll min_find(ll o,ll l,ll r,ll L,ll R){
	if(L<=l&&r<=R)return min_tree[o];
	else if(L>r||l>R)return maxn<<8;
	ll mid=l+r>>1;
	return min(min_find(o*2,l,mid,L,R),min_find(o*2+1,mid+1,r,L,R));
}
int main(){
    scanf("%lld%lld",&n,&q);
    for(ll i=1;i<=n;i++)scanf("%lld",a+i);
    for(ll i=1;i<=n*16;i++)min_tree[i]=1e10;
	build(1,1,n);
	while(q--){
		ll A,B;
		scanf("%lld%lld",&A,&B);
		printf("%lld\n",max_find(1,1,n,A,B)-min_find(1,1,n,A,B));
	}
	return 0;
}


显然,这是线段树 深进中这是优化技巧的题,为什么

2024/9/20 16:45
加载中...