菜鸡40分求助(P8818策略游戏)
查看原帖
菜鸡40分求助(P8818策略游戏)
631896
Wangtsjo楼主2022/11/17 13:16
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){
		if(ch=='-') f=-1; ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);ch=getchar();
	}
	return x*f;
}
const int inf=99999999,inff=-99999999;
int n,m,q;
int lg[100010];
int mbxn[100010][22],mbnn[100010][22];//mbxn是B最大值,mbnn是B最小值 
int maxn[100010][22],mann[100010][22],maxn1[100010][22],mann1[100010][22];//maxn是A最大值,mann是A最小值,maxn1是负数最大值,mann1是非负数最小值 
signed main(){
	n=read();m=read();q=read();
	lg[1]=0;
	for(int i=2;i<=max(n,m);i++) lg[i]=lg[i>>1]+1; 
	for(int i=1;i<=n;i++){
		int u=read();
		maxn[i][0]=mann[i][0]=u;
		if(u<0){
			maxn1[i][0]=u;mann1[i][0]=inf;
		}
		else{
			maxn1[i][0]=inff;mann1[i][0]=u;
		}
	}
	for(int j=1;j<=lg[n];j++)
		for(int i=1;i<=n-(1<<j)+1;i++){
			maxn[i][j]=max(maxn[i][j-1],maxn[i+(1<<j-1)][j-1]);
			maxn1[i][j]=max(maxn1[i][j-1],maxn1[i+(1<<j-1)][j-1]);
			mann[i][j]=min(mann[i][j-1],mann[i+(1<<j-1)][j-1]);
			mann1[i][j]=min(mann1[i][j-1],mann1[i+(1<<j-1)][j-1]);
		}
	for(int i=1;i<=m;i++){
		int u=read();
		mbxn[i][0]=mbnn[i][0]=u;
	}
	for(int j=1;j<=lg[m];j++)
		for(int i=1;i<=n-(1<<j)+1;i++){
			mbxn[i][j]=max(mbxn[i][j-1],mbxn[i+(1<<j-1)][j-1]);
			mbnn[i][j]=min(mbnn[i][j-1],mbnn[i+(1<<j-1)][j-1]);
		}
	while(q--){
		int l1=read(),r1=read(),l2=read(),r2=read();
		int k1=lg[r1-l1+1],k2=lg[r2-l2+1];
		int ans=inff,a1=r1-(1<<k1)+1,b1=r2-(1<<k2)+1;
		int ma=max(maxn[l1][k1],maxn[a1][k1]);
		int ma1=max(maxn1[l1][k1],maxn1[a1][k1]);
		int mia=min(mann[l1][k1],mann[a1][k1]);
		int mia1=min(mann1[l1][k1],mann1[a1][k1]);
		int mb=max(mbxn[l2][k2],mbxn[b1][k2]);
		int mib=min(mbnn[l2][k2],mbnn[b1][k2]);
		int ans1=min(ma*mb,ma*mib),ans2=min(ma1*mb,ma1*mib),ans3=min(mia*mb,mia*mib),ans4=min(mia1*mb,mia1*mib);
//		ans=max(ma*mb,ans);ans=max(ma*mib,ans);
//		ans=max(ma1*mb,ans);ans=max(ma1*mib,ans);
//		ans=max(mia*mb,ans);ans=max(mia*mib,ans);
//		ans=max(mia1*mib,ans);ans=max(mia1*mib,ans);
		ans=max(ans1,max(ans2,max(ans3,ans4)));
		printf("%lld\n",ans);
	}
	return 0;
}
2022/11/17 13:16
加载中...