社区讨论
刚学ST表RE求条
P8818[CSP-S 2022] 策略游戏参与者 3已保存回复 14
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 14 条
- 当前快照
- 1 份
- 快照标识符
- @mhjh01bp
- 此快照首次捕获于
- 2025/11/04 02:25 4 个月前
- 此快照最后确认于
- 2025/11/04 06:17 4 个月前
CPP必关
#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int maxz[100005][32],minz[100005][32],maxf[100005][32],minf[100005][32];
int maxx[100005][32],minn[100005][32];
int a[100005],b[100005];
int fmax(int aa,int bb){
if(aa<0&&bb<0) return max(aa,bb);
else if(aa>0&&bb>0) return min(aa,bb);
else if(aa<0&&bb<0) return bb;
else return aa;
}
int zmin(int aa,int bb){
if(aa>0&&bb>0) return min(aa,bb);
else if(aa<0&&bb<0) return max(aa,bb);
else if(aa>0&&bb<0) return aa;
else return bb;
}
void inita(){
for(int len=1;(1<<len)<=n;len++){
for(int l=1;l+(1<<len)<=n;l++){
maxz[l][len]=max(maxz[l][len-1],maxz[l+(1<<len-1)][len-1]);
minz[l][len]=zmin(minz[l][len-1],minz[l+(1<<len-1)][len-1]);
maxf[l][len]=fmax(maxf[l][len-1],maxf[l+(1<<len-1)][len-1]);
minf[l][len]=min(minf[l][len-1],minf[l+(1<<len-1)][len-1]);
}
}
}
void initb(){
for(int len=1;(1<<len)<=n;len++){
for(int l=1;l+(1<<len)<=n;l++){
maxx[l][len]=max(maxx[l][len-1],maxx[l+(1<<len-1)][len-1]);
minn[l][len]=min(minn[l][len-1],minn[l+(1<<len-1)][len-1]);
}
}
}
int q1(int l,int r){
int k=log2(r-l+1);
return max(maxz[l][k],maxz[r-(1<<k)+1][k]);
}
int q2(int l,int r){
int k=log2(r-l+1);
return min(minz[l][k],minz[r-(1<<k)+1][k]);
}
int q3(int l,int r){
int k=log2(r-l+1);
return max(maxf[l][k],maxf[r-(1<<k)+1][k]);
}
int q4(int l,int r){
int k=log2(r-l+1);
return max(minf[l][k],minf[r-(1<<k)+1][k]);
}
int q5(int l,int r){
int k=log2(r-l+1);
return max(maxx[l][k],maxx[r-(1<<k)+1][k]);
}
int q6(int l,int r){
int k=log2(r-l+1);
return min(minn[l][k],minn[r-(1<<k)+1][k]);
}
int work(int l1,int l2,int r1,int r2){
int a=q1(l1,r1)*q6(l2,r2);
int b=q2(l1,r1)*q6(l2,r2);
int c=q3(l1,r1)*q5(l2,r2);
int d=q4(l1,r1)*q5(l2,r2);
return max({a,b,c,d});
}
int main(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
maxz[i][0]=minz[i][0]=maxf[i][0]=minf[i][0]=maxx[i][0]=minn[i][0]=a[i];
}
for(int i=1;i<=m;i++)
cin>>b[i];
while(q--){
int l1,l2,r1,r2;
cin>>l1>>r1>>l2>>r2;
cout<<work(l1,r1,l2,r2)<<endl;
}
return 0;
}
用了6个st表,马峰不好,请大佬耐心观看
回复
共 14 条回复,欢迎继续交流。
正在加载回复...