社区讨论
0分求调
P8818[CSP-S 2022] 策略游戏参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @ltsg17v1
- 此快照首次捕获于
- 2024/03/15 17:15 2 年前
- 此快照最后确认于
- 2024/03/15 19:38 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N= 100000+100;
int st1[N][21],st2[N][21],st3[N][21],st4[N][21],st5[N][21],st6[N][21];
int n,m,q;
void st(int num)
{
/*if(num==1){
#define f st1
}
else if(num==2){
#define f st2
}
else if(num==3){
#define f st3
}
else if(num==4){
#define f st4
}
else if(num==5){
#define f st5
}
else{
#define f st6
}*/
for(int j=1;(1<<j)<=n;j++){
if(num==1){
for(int i=1;i<=n-(1<<j)+1;i++){
st1[i][j]=max(st1[i][j-1],st1[i+(1<<(j-1))][j-1]);
}
break;
}
else if(num==2){
for(int i=1;i<=n-(1<<j)+1;i++){
st2[i][j]=min(st2[i][j-1],st2[i+(1<<(j-1))][j-1]);
}
break;
}
else if(num==3){
for(int i=1;i<=m-(1<<j)+1;i++){
st3[i][j]=max(st3[i][j-1],st3[i+(1<<(j-1))][j-1]);
}
break;
}
else if(num==4){
for(int i=1;i<=m-(1<<j)+1;i++){
st4[i][j]=min(st4[i][j-1],st4[i+(1<<(j-1))][j-1]);
}
break;
}
else if(num==5){
for(int i=1;i<=n-(1<<j)+1;i++){
st5[i][j]=min(st5[i][j-1],st5[i+(1<<(j-1))][j-1]);
}
break;
}
else if(num==6){
for(int i=1;i<=n-(1<<j)+1;i++){
st6[i][j]=max(st6[i][j-1],st6[i+(1<<(j-1))][j-1]);
}
break;
}
}
}
signed main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
st2[i][0]=st1[i][0]=x;
}
for(int i=1;i<=m;i++){
int x;
scanf("%d",&x);
st4[i][0]=st3[i][0]=x;
}
for(int i=1;i<=n;i++){
if(st1[i][0]>=0) st5[i][0]=st1[i][0];
else st5[i][0]=1e18;
}
for(int i=1;i<=n;i++){
if(st1[i][0]<=0) st6[i][0]=st1[i][0];
else st6[i][0]=LONG_LONG_MIN;
}
for(int i=1;i<=6;i++){
st(i);
}
while(q--)
{
int l1,l2,r1,r2,ans=LONG_LONG_MIN;
scanf("%d %d %d %d",&l1,&l2,&r1,&r2);
int k=log2(r1-l1+1);
int op=log2(r2-l2+1);
int maxn=max(st3[l2][op],st3[r2-(1<<op)+1][op]);
int minn=min(st4[l2][op],st4[r2-(1<<op)+1][op]);
int x=max(st1[l1][k],st1[r1-(1<<k)+1][k]);
if(x>=0) ans=max(ans,minn*x);
else ans=max(ans,maxn*x);
x=min(st2[l1][k],st2[r1-(1<<k)+1][k]);
if(x>=0) ans=max(ans,minn*x);
else ans=max(ans,maxn*x);
x=min(st5[l1][k],st5[r1-(1<<k)+1][k]);
if(x>=0) ans=max(ans,minn*x);
else ans=max(ans,maxn*x);
x=max(st6[l1][k],st6[r1-(1<<k)+1][k]);
if(x>=0) ans=max(ans,minn*x);
else ans=max(ans,maxn*x);
printf("%d\n",ans);
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...