求助树状数组,QWQ
查看原帖
求助树状数组,QWQ
467616
osky123456楼主2022/2/8 21:44

调不出来,思路如下:

1、读入一个数就处理一次最大值最小值

2、最后同时处理最大值,最小值

#include<bits/stdc++.h>
#define ll long long
#define maxn  50010
#define inf 0x7fffffff
using namespace std;
ll Max=-1,Min=inf;
ll h[maxn],n,m,c[maxn],b[maxn];
inline int read(){
	int x=0,t=1;
    char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if(ch=='-') t=-1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
    return x*t;
}
inline ll lowbit(ll x){
	return x& -x;
}
inline void update(ll x,ll k){
	for(;x<=n;x+=lowbit(x)) {
		c[x]=min(c[x],k),b[x]=max(b[x],k);
	}
}
inline ll solve(ll l,ll r){
	Max=-1,Min=0x7fffffff;
	while(l<=r){
		for(;r-(r&-r)>=1;r-=r&-r) 
		    Max=max(Max,b[r]),Min=min(Min,c[r]);
		Max=max(Max,h[r]),Min=min(Min,h[r]);
		r--;//防漏
	}
	return Max-Min;
}
int main(){
	n=read();
	m=read();
	memset(b,inf,sizeof(b));
	memset(c,-1,sizeof(c));
	for(int i=1;i<=n;++i){
		h[i]=read();
		update(i,h[i]);
	}
	while(m--){
		int x=read(),y=read();
		cout<<solve(x,y)<<endl;
	}
	return 0;
}
2022/2/8 21:44
加载中...