比赛 CSP2022提高组 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 策略游戏 最终得分 100
用户昵称 遥时_彼方 运行时间 0.939 s
代码语言 C++ 内存使用 53.59 MiB
提交时间 2022-10-30 11:38:34
显示代码纯文本
#include<bits/stdc++.h>
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define drep(x,y,z) for(int x=y;x>=z;x--)
#define ull unsigned long long
#define ll long long
using namespace std;
inline ll read()
{
	ll x=0;bool flag=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-')flag=0;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	if(flag) return x;
	return ~(x-1);
} 
inline void write(ll x)
{
	if(x<0) {x=~(x-1);putchar('-');}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
////////////////////////////
const int N=1e5+50;
const ll M=1e10;
const ll MIN=-9000000000000000000;
int ac,bc,qc;
ll au[21][N][2],bu[21][N][2];
ll ad[21][N][2],bd[21][N][2];
inline void YCL_a()
{
	ll z1,z2;
	for(int i=1;(1<<i)<=ac;i++)
	{
		for(int o=1;o+(1<<i)-1<=ac;o++)
		{
			if(au[i-1][o][0]==-1) z1=M;
			else z1=au[i-1][o][0];
			if(au[i-1][o+(1<<(i-1))][0]==-1) z2=M;
			else z2=au[i-1][o+(1<<(i-1))][0];
			if(z1==M&&z2==M) au[i][o][0]=-1;
			else au[i][o][0]=min(z1,z2);
			////自然数最小值
			z1=au[i-1][o][1]; 
			z2=au[i-1][o+(1<<(i-1))][1];
			au[i][o][1]=max(z1,z2);
			////自然数最大值
			z1=ad[i-1][o][0]; 
			z2=ad[i-1][o+(1<<(i-1))][0];
			ad[i][o][0]=min(z1,z2);
			////负数最小值
			if(!ad[i-1][o][1]) z1=0-M;
			else z1=ad[i-1][o][1];
			if(!ad[i-1][o+(1<<(i-1))][1]) z2=0-M;
			else z2=ad[i-1][o+(1<<(i-1))][1];
			if(z1==0-M&&z2==0-M) ad[i][o][1]=0;
			else ad[i][o][1]=max(z1,z2);
			////负数最大值 
		}
	}
}
inline void YCL_b()
{
	ll z1,z2;
	for(int i=1;(1<<i)<=bc;i++)
	{
		for(int o=1;o+(1<<i)-1<=bc;o++)
		{
			if(bu[i-1][o][0]==-1) z1=M;
			else z1=bu[i-1][o][0];
			if(bu[i-1][o+(1<<(i-1))][0]==-1) z2=M;
			else z2=bu[i-1][o+(1<<(i-1))][0];
			if(z1==M&&z2==M) bu[i][o][0]=-1;
			else bu[i][o][0]=min(z1,z2);
			////自然数最小值
			z1=bu[i-1][o][1]; 
			z2=bu[i-1][o+(1<<(i-1))][1];
			bu[i][o][1]=max(z1,z2);
			////自然数最大值
			z1=bd[i-1][o][0]; 
			z2=bd[i-1][o+(1<<(i-1))][0];
			bd[i][o][0]=min(z1,z2);
			////负数最小值
			if(!bd[i-1][o][1]) z1=0-M;
			else z1=bd[i-1][o][1];
			if(!bd[i-1][o+(1<<(i-1))][1]) z2=0-M;
			else z2=bd[i-1][o+(1<<(i-1))][1];
			if(z1==0-M&&z2==0-M) bd[i][o][1]=0;
			else bd[i][o][1]=max(z1,z2);
			////负数最大值 
		}
	}
}
ll ans;
inline void solve(int la,int ra,int lb,int rb)
{
	int l1=0,l2=0;
	while((1<<l1)<=ra-la+1) l1++;
	l1--;
	while((1<<l2)<=rb-lb+1) l2++;
	l2--;
	ll ua[2],da[2],ub[2],db[2];
	ll z1,z2;
	//// 
	if(au[l1][la][0]==-1) z1=M;
	else z1=au[l1][la][0];
	if(au[l1][ra-(1<<l1)+1][0]==-1) z2=M;
	else z2=au[l1][ra-(1<<l1)+1][0];
	if(z1==M&&z2==M) ua[0]=-1;
	else ua[0]=min(z1,z2);
	//a组自然数最小值
	z1=au[l1][la][1]; 
	z2=au[l1][ra-(1<<l1)+1][1];
	ua[1]=max(z1,z2);
	//a组自然数最大值 	
	z1=ad[l1][la][0]; 
	z2=ad[l1][ra-(1<<l1)+1][0];
	da[0]=min(z1,z2);
	//a组负数最小值
	z1=ad[l1][la][1];
	z2=ad[l1][ra-(1<<l1)+1][1];
	if(!z1) z1=0-M;
	if(!z2) z2=0-M;
	if(z1==0-M&&z2==0-M) da[1]=0;
	else da[1]=max(z1,z2);
	//a组负数最大值 
	if(bu[l2][lb][0]==-1) z1=M;
	else z1=bu[l2][lb][0];
	if(bu[l2][rb-(1<<l2)+1][0]==-1) z2=M;
	else z2= bu[l2][rb-(1<<l2)+1][0];
	if(z1==M&&z2==M) ub[0]=-1;
	else ub[0]=min(z1,z2);
	//b组自然数最小值
	z1=bu[l2][lb][1]; 
	z2=bu[l2][rb-(1<<l2)+1][1];
	ub[1]=max(z1,z2);
	//b组自然数最大值 	
	z1=bd[l2][lb][0]; 
	z2=bd[l2][rb-(1<<l2)+1][0];
	db[0]=min(z1,z2);
	//b组负数最小值
	z1=bd[l2][lb][1];
	z2=bd[l2][rb-(1<<l2)+1][1];
	if(!z1) z1=0-M;
	if(!z2) z2=0-M;
	if(z1==0-M&&z2==0-M) db[1]=0;
	else db[1]=max(z1,z2);
	//b组负数最大值 
	if(db[0]<0&&ub[1]>=0)
	{
		if(ua[0]==-1) z1=MIN;
		else z1=ua[0]*db[0];
		if(!da[1]) z2=MIN;
		else z2=da[1]*ub[1];
	}
	else if(!db[0])//b组只有自然数 
	{
		if(ua[1]==-1) z1=MIN;
		else z1=ua[1]*ub[0];
		if(!da[1]) z2=MIN;
		else z2=da[1]*ub[1];
	}
	else//b组只有负数 
	{
		if(ua[0]==-1) z1=MIN;
		else z1=ua[0]*db[0];
		if(!da[0]) z2=MIN;
		else z2=da[0]*db[1];
	}
	ans=max(z1,z2);
	write(ans),putchar(10);
}
int main()
{
    freopen("csp2022_game.in","r",stdin);
	freopen("csp2022_game.out","w",stdout);
    ac=read(),bc=read(),qc=read();
    rep(i,1,ac) 
    {
    	au[0][i][0]=read();
    	if(au[0][i][0]<0)
    	{
    		ad[0][i][0]=ad[0][i][1]=au[0][i][0];
    		au[0][i][0]=au[0][i][1]=-1;
		}
		else au[0][i][1]=au[0][i][0];
	}
    rep(i,1,bc) 
    {
    	bu[0][i][0]=read();
    	if(bu[0][i][0]<0)
    	{
    		bd[0][i][0]=bd[0][i][1]=bu[0][i][0];
    		bu[0][i][0]=bu[0][i][1]=-1;
		}
		else bu[0][i][1]=bu[0][i][0];
	}
	YCL_a();
	YCL_b();
	int la,ra,lb,rb;
	rep(i,1,qc)
	{
		la=read(),ra=read(),lb=read(),rb=read();
		solve(la,ra,lb,rb);
	}
    return 0;
}