线段树卡住了?找不出问题,求dalao提出建议%%%
查看原帖
线段树卡住了?找不出问题,求dalao提出建议%%%
640477
biophitma_wby楼主2024/10/1 21:26
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10,INF=0x5f5f5f5f;
int n,m,q,a[N],b[N];
struct Tree{
	int l,r,pre_max,pre_min;
	int max_pos,min_pos,max_neg,min_neg;
}t1[4*N],t2[4*N];
void update(int id,Tree t[]){
	t[id].pre_max=max(t[id*2].pre_max,t[id*2+1].pre_max);
	t[id].pre_min=min(t[id*2].pre_min,t[id*2+1].pre_min);
	
	t[id].max_pos=max(t[id*2].max_pos,t[id*2+1].max_pos);
	t[id].min_pos=min(t[id*2].min_pos,t[id*2+1].min_pos);
	
	t[id].max_neg=max(t[id*2].max_neg,t[id*2+1].max_neg);
	t[id].min_neg=min(t[id*2].min_neg,t[id*2+1].min_neg);
}
void build(int id,int l,int r,Tree t[],int x[]){
	if(l==r){
		t[id].pre_max=t[id].pre_min=x[l];
		if(x[l]>=0){
			t[id].max_pos=t[id].min_pos=x[l];
			t[id].min_neg=INF;
			t[id].max_neg=-INF;
		}else{
			t[id].max_neg=t[id].min_neg=x[l];
			t[id].max_pos=-INF;
			t[id].min_pos=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&&t[id].r<=r){
		return t[id].pre_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(mid<r)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&&t[id].r<=r){
		return t[id].pre_min;
	}
	int ans=INF;
	int mid=(t[id].l+t[id].r)>>1;
	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 askformax_pos(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&t[id].r<=r){
		return t[id].max_pos;
	}
	int ans=-INF;
	int mid=(t[id].l+t[id].r)>>1;
	if(l<=mid)ans=max(ans,askformax_pos(id*2,l,r,t));
	if(r>mid)ans=max(ans,askformax_pos(id*2+1,l,r,t));
	return ans;
}
int askformin_pos(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&t[id].r<=r){
		return t[id].min_pos;
	}
	int ans=INF;
	int mid=(t[id].l+t[id].r)>>1;
	if(l<=mid)ans=min(ans,askformin_pos(id*2,l,r,t));
	if(r>mid)ans=min(ans,askformin_pos(id*2+1,l,r,t));
	return ans;
}

int askformax_neg(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&t[id].r<=r){
		return t[id].max_neg;
	}
	int ans=-INF;
	int mid=(t[id].l+t[id].r)>>1;
	if(l<=mid)ans=max(ans,askformax_neg(id*2,l,r,t));
	if(r>mid)ans=max(ans,askformax_neg(id*2+1,l,r,t));
	return ans;
}
int askformin_neg(int id,int l,int r,Tree t[]){
	if(l<=t[id].l&&t[id].r<=r){
		return t[id].min_neg;
	}
	int ans=INF;
	int mid=(t[id].l+t[id].r)>>1;
	if(l<=mid)ans=max(ans,askformin_neg(id*2,l,r,t));
	if(r>mid)ans=max(ans,askformin_neg(id*2+1,l,r,t));
	return ans;
}
int l1,r1,l2,r2,ans,f1=0,f2=0;
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,t1,a);
	build(1,1,m,t2,b);
	while(q--){
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		
		int a_max=askformax(1,l1,r1,t1);cout<<"nb\n";
		int b_max=askformax(1,l2,r2,t2);
		int b_min=askformin(1,l2,r2,t2);
		if(f1==0&&f2==0){
			cout<<"nb\n";
			printf("%d",a_max*b_min);
		}
		ans=-INF+1;
		int a_max_pos=askformax_pos(1,l1,r1,t1);
		int a_min_pos=askformin_pos(1,l1,r1,t1);
		int a_max_neg=askformax_neg(1,l1,r2,t1);
		int a_min_neg=askformin_neg(1,l1,r1,t1);
		
		if(a_max_pos!=-INF)ans=max(ans,a_max_pos*b_min);
		else ans=max(ans,a_max_neg*b_min);
		
		if(a_min_neg!=INF)ans=max(ans,a_min_neg*b_max);
		else ans=max(ans,a_min_neg*b_min);
		
		if(a_max_neg!=-INF)ans=max(ans,a_max_pos*b_max);
		
		if(a_min_pos!=INF)ans=max(ans,a_min_pos*b_min);
		printf("%d\n",ans);
	}
	return 0;
}

借鉴了网上的做法

2024/10/1 21:26
加载中...