梅开二度
查看原帖
梅开二度
917775
_buzhidao_楼主2024/4/19 21:46

样例#2输出:

0
2000000000000000000
6
2
2

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,qs;ll a[100005],b[100005];
int l1,r1,l2,r2;ll ans;
ll q[10];
struct tree{
	int l,r;ll va[4];
	//最大va 最小va 最大负 最小正
} t1[400005],t2[400005];
void buildt1(int p,int l,int r){
	t1[p]={l,r};
	if(l==r){
	    t1[p].va[0]=t1[p].va[1]=a[l];
	    t1[p].va[2]=(a[l]<0)?a[l]:1e18;
	    t1[p].va[3]=(a[l]>=0)?-1e18:a[l];
	    return;
	}
	int mid=(l+r)>>1;
	buildt1(p*2,l,mid);buildt1(p*2+1,mid+1,r);
	t1[p].va[0]=max(t1[p*2].va[0],t1[p*2+1].va[0]);
	t1[p].va[1]=min(t1[p*2].va[1],t1[p*2+1].va[1]);
	t1[p].va[3]=max(t1[p*2].va[3],t1[p*2+1].va[3]);
	t1[p].va[4]=min(t1[p*2].va[4],t1[p*2+1].va[4]);
}
ll query1(int p,int l,int r,int rs){
	if(t1[p].l>=l&&t1[p].r<=r) return t1[p].va[rs];
	int mid=(t1[p].l+t1[p].r)/2;ll res=-1e18;
	if(rs==0){
		if(l<=mid) res=max(res,query1(p*2,l,r,rs));
		if(r>mid) res=max(res,query1(p*2+1,l,r,rs));
	}
	else if(rs==1){
	    res=1e18;
		if(l<=mid) res=min(res,query1(p*2,l,r,rs));
		if(r>mid) res=min(res,query1(p*2+1,l,r,rs));
	}
	else if(rs==2){//最大负
		ll tmp1=-1e18,tmp2=-1e18;
		if(l<=mid) tmp1=query1(p*2,l,r,rs);
		if(r>mid) tmp2=query1(p*2+1,l,r,rs);
		if(tmp1<0) res=max(res,tmp1);
		if(tmp2<0) res=max(res,tmp2);
	}
	else{//最小非负
		res=1e18;ll tmp1=1e18,tmp2=1e18;
		if(l<=mid) tmp1=query1(p*2,l,r,rs);
		if(r>mid) tmp2=query1(p*2+1,l,r,rs);
		if(tmp1>=0) res=min(res,tmp1);
		if(tmp2>=0) res=min(res,tmp2);
	}return res;
}
void buildt2(int p,int l,int r){
	t2[p]={l,r};
	if(l==r){t2[p].va[0]=t2[p].va[1]=b[l];return;}
	int mid=(l+r)>>1;
	buildt2(p*2,l,mid);buildt2(p*2+1,mid+1,r);
	t2[p].va[1]=min(t2[p*2].va[1],t2[p*2+1].va[1]);
	t2[p].va[0]=max(t2[p*2].va[0],t2[p*2+1].va[0]);
}
ll query2(int p,int l,int r,int rs){
	if(t2[p].l>=l&&t2[p].r<=r) return t2[p].va[rs];
	int mid=(t2[p].l+t2[p].r)/2;ll res=-1e18;
	if(rs==0){
		if(l<=mid) res=max(res,query2(p*2,l,r,rs));
		if(r>mid) res=max(res,query2(p*2+1,l,r,rs));
	}
	else{
	    res=1e18;
		if(l<=mid) res=min(res,query2(p*2,l,r,rs));
		if(r>mid) res=min(res,query2(p*2+1,l,r,rs));
	}return res;
}
#define o(s) printf(s)//
int main(){
	cin>>n>>m>>qs;
	for(int i=1;i<=n;++i) cin>>a[i];
	for(int i=1;i<=m;++i) cin>>b[i];
	buildt1(1,1,n);buildt2(1,1,m);
	for(int i=0;i<qs;++i){
		cin>>l1>>r1>>l2>>r2;
		q[1]=query1(1,l1,r1,0);q[2]=query1(1,l1,r1,1);q[3]=query1(1,l1,r1,2);
		q[6]=query2(1,l2,r2,1);q[5]=query2(1,l2,r2,0);q[4]=query1(1,l1,r1,3);
		if(q[3]==-1e18||q[3]==1e18) q[3]=q[4];
		if(q[4]==1e18||q[4]==-1e18) q[4]=q[3];
		cout<<q[1]<<' '<<q[2]<<' '<<q[3]<<' '<<q[4]<<' '<<q[5]<<' '<<q[6]<<' ';//
		if(q[6]<0){
			if(q[5]>=0){//对面可正可负
				if(q[6]*q[3]>q[5]*q[4]) ans=q[3]*q[6],o("1 ");
				else ans=q[4]*q[5],o("2 ");
			}
			else ans=q[2]*q[5],o("3 ");
		}
		else{//q[6]>=q[5]>=0
			ans=q[1]*q[5],o("4 ");
		}
		cout<<ans<<endl;
	}
	return 0;
}

行尾有 // 的代码是调试用代码

2024/4/19 21:46
加载中...