线段树样例过,提交全WA。
查看原帖
线段树样例过,提交全WA。
640477
biophitma_wby楼主2024/10/2 20:11
#include<bits/stdc++.h>
using namespace std;
const int N=100020,inf=0x7f7f7f7f;
int n,m,q,a[N],b[N];
struct Tree{
	int l,r,max,min;
	int pos_max,pos_min,neg_max,neg_min;
}t_a[N*4],t_b[N*4];
bool f1=0,f2=0;
int l1,r1,l2,r2;
void update(int id,Tree t[]){
	t[id].max=max(t[id*2].max,t[id*2+1].max);
	t[id].min=min(t[id*2].min,t[id*2+1].min);
	
	t[id].pos_max=max(t[id*2].pos_max,t[id*2+1].pos_max);
	t[id].pos_min=min(t[id*2].pos_min,t[id*2+1].pos_min);
	
	t[id].neg_max=max(t[id*2].neg_max,t[id*2+1].neg_max);
	t[id].neg_min=min(t[id*2].neg_min,t[id*2+1].neg_min);
}
void build(int id,int l,int r,Tree t[],int x[]){
	t[id]={l,r};
	if(l==r){
		t[id].max=t[id].min=x[l];
		if(x[l]>=0){
			t[id].pos_max=t[id].pos_min=x[l];
			t[id].neg_max=-inf;
			t[id].neg_min=inf;
		}else{
			t[id].neg_max=t[id].neg_min=x[l];
			t[id].pos_max=-inf;
			t[id].pos_min=inf;
		}
		return;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid,t,x);
	build(id*2+1,mid+1,r,t,x);
	update(id,t);
}
int askformax(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&r>=t[id].r){
		return t[id].max;
	}
	int ans=-inf;
	int mid=(t[id].l+t[id].r)/2;
	if(l<=mid)ans=max(ans,askformax(id*2,l,r,t));
	if(r>mid)ans=max(ans,askformax(id*2+1,l,r,t));
	return ans;
}
int askformin(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&r>=t[id].r){
		return t[id].min;
	}
	int ans=inf;
	int mid=(t[id].l+t[id].r)/2;
	if(l<=mid)ans=min(ans,askformin(id*2,l,r,t));
	if(r>mid)ans=min(ans,askformin(id*2+1,l,r,t));
	return ans;
}

int askforpos_max(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&r>=t[id].r){
		return t[id].pos_max;
	}
	int ans=-inf;
	int mid=(t[id].l+t[id].r)/2;
	if(l<=mid)ans=max(ans,askforpos_max(id*2,l,r,t));
	if(r>mid)ans=max(ans,askforpos_max(id*2+1,l,r,t));
	return ans;
}
int askforpos_min(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&r>=t[id].r){
		return t[id].pos_min;
	}
	int ans=inf;
	int mid=(t[id].l+t[id].r)/2;
	if(l<=mid)ans=min(ans,askforpos_min(id*2,l,r,t));
	if(r>mid)ans=min(ans,askforpos_min(id*2+1,l,r,t));
	return ans;
}

int askforneg_max(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&r>=t[id].r){
		return t[id].neg_max;
	}
	int ans=-inf;
	int mid=(t[id].l+t[id].r)/2;
	if(l<=mid)ans=max(ans,askforneg_max(id*2,l,r,t));
	if(r>mid)ans=max(ans,askforneg_max(id*2+1,l,r,t));
	return ans;
}
int askforneg_min(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&r>=t[id].r){
		return t[id].neg_min;
	}
	int ans=inf;
	int mid=(t[id].l+t[id].r)/2;
	if(l<=mid)ans=min(ans,askforneg_min(id*2,l,r,t));
	if(r>mid)ans=min(ans,askforneg_min(id*2+1,l,r,t));
	return ans;
}
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(a[i]<0)f1=1;
	}
	for(int i=1;i<=m;i++){
		scanf("%d",&b[i]);
		if(b[i]<0)f2=1;
	}
	build(1,1,n,t_a,a);
	build(1,1,m,t_b,b);
	while(q--){
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		if(f1==0&&f2==0){
			printf("%d\n",askformax(1,l1,r1,t_a)*askformin(1,l2,r2,t_b));
			continue;
		}
		int ans=-inf;
		int a_pos_max=askforpos_max(1,l1,r1,t_a);
		int a_pos_min=askforpos_min(1,l1,r1,t_a);
		int a_neg_max=askforneg_max(1,l1,r1,t_a);
		int a_neg_min=askforneg_min(1,l1,r1,t_a);
		
		int b_max=askformax(1,l2,r2,t_b);
		int b_min=askformin(1,l2,r2,t_b);
		
		if(a_pos_max!=-inf)ans=max(ans,a_pos_max*b_min);
		else ans=max(ans,a_neg_max*b_max);
		if(a_neg_min!=inf)ans=max(ans,a_neg_min*b_max);
		else ans=max(ans,a_pos_min*b_min);
		if(a_neg_max!=-inf)ans=max(ans,a_neg_max*b_max);
		if(a_pos_min!=inf)ans=max(ans,a_pos_min*b_min);
		printf("%d\n",ans);
	}
	return 0;
}
2024/10/2 20:11
加载中...