ST表 85分求助
查看原帖
ST表 85分求助
700388
ljw0102楼主2023/10/4 13:26

感觉思路都对,实在找不出错误了

WA #29#36#37

#include<iostream>
#include<cstdio>
#include<cmath>
#define N 100005
#define INF 0x3f3f3f3f3f3f3f3f
#define LL long long
using namespace std;
int n,m,q;
LL a[N],b[N];
LL fa[N][20][2],fb[N][20][2];//a、b数组最大/小值
LL f[N][20][2];//a数组中最大的非正数/最小的非负数 
int query(int l,int r,int k){
	int t=log(r-l+1)/log(2);
	if(k==1) return max(fa[l][t][0],fa[r-(1<<t)+1][t][0]);
	if(k==2) return min(fa[l][t][1],fa[r-(1<<t)+1][t][1]);
	if(k==3) return max(fb[l][t][0],fb[r-(1<<t)+1][t][0]);
	if(k==4) return min(fb[l][t][1],fb[r-(1<<t)+1][t][1]);
	if(k==5) return max(f[l][t][0],f[r-(1<<t)+1][t][0]);
	if(k==6) return min(f[l][t][1],f[r-(1<<t)+1][t][1]);
}
int main(){
	//freopen("game.in","r",stdin);
	//freopen("game.ans","w",stdout);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) {
		scanf("%lld",&a[i]);
		fa[i][0][0]=fa[i][0][1]=a[i];
		if(a[i]>0) f[i][0][0]=-INF,f[i][0][1]=a[i];
		if(a[i]<0) f[i][0][0]=a[i],f[i][0][1]=INF;
		if(a[i]==0) f[i][0][0]=f[i][0][1]=0;
	}
	for(int i=1;i<=m;i++) {
		scanf("%lld",&b[i]);
		fb[i][0][0]=fb[i][0][1]=b[i];
	}
	int t1=log(n)/log(2)+1,t2=log(m)/log(2)+1;
	for(int j=1;j<t1;j++)
		for(int i=1;i<=n-(1<<j)+1;i++){
			fa[i][j][0]=max(fa[i][j-1][0],fa[i+(1<<(j-1))][j-1][0]);
			fa[i][j][1]=min(fa[i][j-1][1],fa[i+(1<<(j-1))][j-1][1]);
			f[i][j][0]=max(f[i][j-1][0],f[i+(1<<(j-1))][j-1][0]);
			f[i][j][1]=min(f[i][j-1][1],f[i+(1<<(j-1))][j-1][1]);
			
		}
	for(int j=1;j<t2;j++)
		for(int i=1;i<=m-(1<<j)+1;i++){
			fb[i][j][0]=max(fb[i][j-1][0],fb[i+(1<<(j-1))][j-1][0]);
			fb[i][j][1]=min(fb[i][j-1][1],fb[i+(1<<(j-1))][j-1][1]);
		}
	while(q--){
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		LL chose1,chose2; 
		LL mx=query(l2,r2,3),mn=query(l2,r2,4);
		if(mn>=0){
			chose1=query(l1,r1,1);
			if(chose1<=0) chose2=mx;
			else chose2=mn;
			printf("%lld\n",chose1*chose2);
		} 
		else if(mx<=0){
			chose1=query(l1,r1,2);
			if(chose1>=0) chose2=mn;
			else chose2=mx;
			printf("%lld\n",chose1*chose2);
		}
		else{
			int mx2=query(l1,r1,5),mn2=query(l1,r1,6);
			if(mx2==0) puts("0");
			else{
				LL ans=-INF;
				if(mx2==-INF) ans=mn*mn2;
				else if(mn2==INF) ans=mx*mx2;
				else ans=max(mx*mx2,mn*mn2);
				printf("%lld\n",ans);
			}
		}
	}
	return 0;
}

2023/10/4 13:26
加载中...