社区讨论
st表0pts求调
P8818[CSP-S 2022] 策略游戏参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @loy5pwmr
- 此快照首次捕获于
- 2023/11/14 17:54 2 年前
- 此快照最后确认于
- 2023/11/14 19:48 2 年前
CPP
#include<iostream>
#include<cstdio>
using namespace std;
long long mx=999999999999,nx=-999999999999;
int n,m,q;
int l1,r1,l2,r2;
long long a,b;
long long maxx[100010][50],minn[100010][50],z[100010][50],f[100010][50];
//用于存储a数组的最大,最小,正区间最小,负区间最大
long long b1[100010][50],b2[100010][50];
//用于存储b数组的最大值和最小值
long long lg1[100010]={-1},lg2[100010]={-1};
//倍增
int main(){
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&a);
lg1[i]=lg1[i/2]+1;
maxx[i][0]=a;
minn[i][0]=a;
if(a>=0)z[i][0]=a;
else z[i][0]=mx;
if(a<0)f[i][0]=a;
else f[i][0]=nx;
}
for(int i=1;i<=m;i++){
scanf("%lld",&b);
lg2[i]=lg2[i/2]+1;
b1[i][0]=b;
b2[i][0]=b;
}//输入,预处理
for(int i=1;i<=lg1[n];i++){
for(int j=1;j+(1<<i)-1<=n;j++){
int p=j+(1<<(i-1));
maxx[j][i]=max(maxx[j][i-1],maxx[p][i-1]);
minn[j][i]=min(minn[j][i-1],minn[p][i-1]);
z[j][i]=min(z[j][i-1],z[p][i-1]);
f[j][i]=max(f[j][i-1],f[p][i-1]);
}
}
for(int i=1;i<=lg2[m];i++){
for(int j=1;j+(1<<i)-1<=n;j++){
int p=j+(1<<(i-1));
b1[j][i]=max(b1[j][i-1],b1[p][i-1]);
b2[j][i]=min(b2[j][i-1],b2[p][i-1]);
}
}//a和b的st表预处理
//最后求值
long long maxa,maxb;
//a和b的选值
long long zz1,zz2,zz3,zz4,zz;
//四种情况
int len1,len2,p1,p2;
for(int i=1;i<=q;i++){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
len1=lg1[r1-l1+1];len2=lg2[r2-l2+1];
p1=r1-(1<<len1)+1;p2=r2-(1<<len2)+1;
maxb=min(b2[l2][len2],b2[p2][len2]);
maxa=max(maxx[l1][len1],maxx[p1][len1]);
zz1=maxa*maxb;
maxa=min(z[l1][len1],z[p1][len1]);
zz2=maxa*maxb;
if(maxa==999999999999)zz2=-maxa;
maxb=max(b1[l2][len2],b1[p2][len2]);
maxa=min(minn[l1][len1],minn[p1][len1]);
zz3=maxa*maxb;
maxa=max(f[l1][len1],f[p1][len1]);
zz4=maxa*maxb;
if(maxa==-999999999999)zz4=maxa;
zz=max(max(zz1,zz2),max(zz3,zz4));
printf("%lld\n",zz);
}
return 0;
}
样例12都过了
回复
共 0 条回复,欢迎继续交流。
正在加载回复...