40PTS的st表 求大佬帮忙调试
查看原帖
40PTS的st表 求大佬帮忙调试
626973
LiuyiJushi楼主2024/9/8 22:16
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e5+5,inf=1e9+1;//极大值
int n,m;
int A[N],B[N],Temp[N],Log[N];
struct ST{
//将ST表简单封装了一下,避免大量代码重复
	int a[N][20];
	void init(int len,int cmp(int,int)){
		for(int i=1;i<=len;i++) a[i][0]=Temp[i];
		for(int j=1;(1<<j-1)<=len;j++){
			for(int i=1;i<=len;i++){
				int k=i+(1<<j-1);
				a[i][j]=a[i][j-1];
				if(k<=len) a[i][j]=cmp(a[i][j],a[k][j-1]);
			}
		}
		return;
	}
	int value(int l,int r,int cmp(int,int)){
		int siz=Log[r-l+1];
		return cmp(a[l][siz],a[r-(1<<siz)+1][siz]);
	}
}st[6];
/*
A pos max  0
A pos min  1
A neg max  2
A neg min  3
B max      4
B min      5
*/
int mymax(int x,int y){
	return x>y ? x : y;
}
int mymin(int x,int y){
	return x<y ? x : y;
}
signed main(){
	int que;
	scanf("%lld%lld%lld",&n,&m,&que);
	for(int i=1;i<=n;i++) scanf("%lld",A+i);
	for(int i=1;i<=m;i++) scanf("%lld",B+i);
	
	//初始化ST表
	for(int i=2;i<=n || i<=m;i++) Log[i]=Log[i>>1]+1;
	for(int i=1;i<=n;i++) Temp[i]=A[i];
	st[0].init(n,mymax);
	st[3].init(n,mymin);
	for(int i=1;i<=n;i++) Temp[i]=(A[i] >=0 ? A[i] : inf);
	st[1].init(n,mymin);
	for(int i=1;i<=n;i++) Temp[i]=(A[i] <=0 ? A[i] : -inf);
	st[2].init(n,mymax);
	for(int i=1;i<=m;i++) Temp[i]=B[i];
	st[4].init(m,mymax);
	st[5].init(m,mymin);
	
	
	while(que--){
		int l1,r1,l2,r2;
		scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
		int a[]={st[0].value(l1,r1,mymax),st[1].value(l1,r1,mymin),
		st[2].value(l1,r1,mymax),st[3].value(l1,r1,mymin)};
		int b[]={st[4].value(l2,r2,mymax),st[5].value(l2,r2,mymin)};
		long long ans=-1ll*inf*inf;
		for(int i=0;i<4;i++){
			long long now=min(1ll*a[i]*b[0],1ll*a[i]*b[1]);
			ans=max(ans,now);
		}
		printf("%lld\n",ans);
	}
	return 0;
}
2024/9/8 22:16
加载中...