比赛 |
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;
}