70分求助
查看原帖
70分求助
551803
BPG_ning楼主2022/10/30 16:53
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e5+10;
int n,m,q,a[maxn],b[maxn],lg[maxn];
LL minaz[maxn][30],minaf[maxn][30],maxaz[maxn][30],maxaf[maxn][30],maxb[maxn][30],minb[maxn][30];
void ST_min(int n,LL st[maxn][30]){
	for(int k=1;k<=29;k++){
		for(int i=1;i+(1<<k)-1<=n;i++){
			st[i][k]=min(st[i][k-1],st[i+(1<<(k-1))][k-1]);
		}
	} 
	return ;
}
void ST_max(int n,LL st[maxn][30]){
	for(int k=1;k<=29;k++){
		for(int i=1;i+(1<<k)-1<=n;i++){
			st[i][k]=max(st[i][k-1],st[i+(1<<(k-1))][k-1]);
		}
	} 
	return ;
}
LL qmin(int l,int r,LL st[maxn][30]){
	int k=lg[r-l+1];
	LL tmp=min(st[l][k],st[r-(1<<k)+1][k]);
	return tmp;
}
LL qmax(int l,int r,LL st[maxn][30]){
	int k=lg[r-l+1];
	return max(st[l][k],st[r-(1<<k)+1][k]);
}
int main(){
	ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	cin>>n>>m>>q;
	lg[0]=-1;
	for(int i=1;i<=n;i++) lg[i]=lg[i/2]+1;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	for(int i=0;i<maxn;i++) for(int k=0;k<=29;k++) minaz[i][k]=1e9;
	for(int i=0;i<maxn;i++) for(int k=0;k<=29;k++) minaf[i][k]=1e9;
	for(int i=0;i<maxn;i++) for(int k=0;k<=29;k++) minb[i][k]=1e9;
	for(int i=0;i<maxn;i++) for(int k=0;k<=29;k++) maxaz[i][k]=-1e9;
	for(int i=0;i<maxn;i++) for(int k=0;k<=29;k++) maxaf[i][k]=-1e9;
	for(int i=0;i<maxn;i++) for(int k=0;k<=29;k++) maxb[i][k]=-1e9;
	for(int i=1;i<=n;i++){
		if(a[i]>=0)minaz[i][0]=maxaz[i][0]=a[i];
		if(a[i]<=0) maxaf[i][0]=minaf[i][0]=-a[i];
	}
	for(int i=1;i<=m;i++) minb[i][0]=maxb[i][0]=b[i];
	ST_min(n,minaz);
	ST_min(n,minaf);
	ST_min(m,minb);
	ST_max(n,maxaz);
	ST_max(n,maxaf);
	ST_max(m,maxb);
//	for(int i=1;i<=n;i++){
//		for(int j=i;j<=n;j++) cout<<i<<' '<<j<<' '<<qmin(i,j,minaz)<<endl;
//	}
	while(q--){
		int l1,r1,l2,r2;
		LL ans1=-1e18,ans2=-1e18;
		cin>>l1>>r1>>l2>>r2;
		if(qmin(l2,r2,minb)>0) ans1=qmax(l1,r1,maxaz)*qmin(l2,r2,minb);
		if(qmin(l2,r2,minb)<=0) ans1=qmin(l1,r1,minaz)*qmin(l2,r2,minb);
		if(qmax(l2,r2,maxb)>0) ans2=qmin(l1,r1,minaf)*qmax(l2,r2,maxb);
		if(qmax(l2,r2,maxb)<=0) ans2=qmax(l1,r1,maxaf)*qmax(l2,r2,maxb);
		cout<<max(ans1,-ans2);
		cout<<endl; 
	}
	return 0;
} 

考场上大数据没过,但是来不及改了

2022/10/30 16:53
加载中...