除了特性 A 几乎全部 WA
本人推测可能是分讨错了,建ST表没错,结论也没错,但是调不出来。萌新求条
代码:
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int p[100001];
int a[100001];
int b[100001];
int sa[100001];
int sb[100001];
int a_max[100001][20];
int a_min[100001][20];
int b_max[100001][20];
int b_min[100001][20];
int a_max_b[100001][20];
int a_min_a[100001][20];
int n,m,q,l1,l2,r1,r2;
int q1(){
int R=r1,L=l1,cur=log2(R-L+1);
return min(a_min[L][cur],a_min[(R-(1<<cur)+1)][cur]);
}
int q2(){
int R=r1,L=l1,cur=log2(R-L+1);
return max(a_max[L][cur],a_max[(R-(1<<cur)+1)][cur]);
}
int q3(){
int R=r1,L=l1,cur=log2(R-L+1);
return min(a_min_a[L][cur],a_min_a[(R-(1<<cur)+1)][cur]);
}
int q4(){
int R=r1,L=l1,cur=log2(R-L+1);
return max(a_max_b[L][cur],a_max_b[(R-(1<<cur)+1)][cur]);
}
int q5(){
int R=r2,L=l2,cur=log2(R-L+1);
return min(b_min[L][cur],b_min[(R-(1<<cur)+1)][cur]);
}
int q6(){
int R=r2,L=l2,cur=log2(R-L+1);
return max(b_max[L][cur],b_max[(R-(1<<cur)+1)][cur]);
}
signed main(){
cin>>n>>m>>q;p[0]=1;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
for(int i=1;i<=20;i++){
p[i]=p[i-1]*2;
}
for(int i=1;i<=n;i++){
sa[i]=sa[i-1]+(a[i]>=0);
a_max[i][0]=a[i];
a_min[i][0]=a[i];
a_max_b[i][0]=(a[i]<0?a[i]:-1e12);
a_min_a[i][0]=(a[i]>=0?a[i]:1e12);
}
for(int i=1;i<=m;i++){
sb[i]=sb[i-1]+(b[i]>=0);
b_max[i][0]=b[i];
b_min[i][0]=b[i];
}
for(int j=1;p[j]<=n;j++){
for(int l=1;l+p[j]-1<=n;l++){
int r=l+p[j]-1;
a_max[l][j]=max(a_max[l][j-1],a_max[l+p[j-1]][j-1]);
a_min[l][j]=min(a_min[l][j-1],a_min[l+p[j-1]][j-1]);
a_max_b[l][j]=max(a_max_b[l][j-1],a_max_b[l+p[j-1]][j-1]);
a_min_a[l][j]=min(a_min_a[l][j-1],a_min_a[l+p[j-1]][j-1]);
}
}
for(int j=1;p[j]<=m;j++){
for(int l=1;l+p[j]-1<=m;l++){
int r=l+p[j]-1;
b_max[l][j]=max(b_max[l][j-1],b_max[l+p[j-1]][j-1]);
b_min[l][j]=min(b_min[l][j-1],b_min[l+p[j-1]][j-1]);
}
}
// for(int i=1;i<=n;i++){for(int j=1;i+p[j]-1<=n;j++)cout<<a_max[i][j]<<" ";cout<<endl;}
// for(int i=1;i<=n;i++){for(int j=1;i+p[j]-1<=n;j++)cout<<a_min[i][j]<<" ";cout<<endl;}
// for(int i=1;i<=n;i++){for(int j=1;i+p[j]-1<=n;j++)cout<<a_max_b[i][j]<<" ";cout<<endl;}
// for(int i=1;i<=n;i++){for(int j=1;i+p[j]-1<=n;j++)cout<<a_min_a[i][j]<<" ";cout<<endl;}
// for(int i=1;i<=m;i++){for(int j=1;i+p[j]-1<=m;j++)cout<<b_max[i][j]<<" ";cout<<endl;}
// for(int i=1;i<=m;i++){for(int j=1;i+p[j]-1<=m;j++)cout<<b_min[i][j]<<" ";cout<<endl;}
for(int i=1;i<=q;i++){
cin>>l1>>r1>>l2>>r2;
int a1=sa[r1]-sa[l1-1];
int b1=sb[r2]-sb[l2-1];
if(a1!=0)a1=(a1==r1-l1+1?2:1);
if(b1!=0)b1=(b1==r2-l2+1?2:1);
int now=a1*3+b1,ans;
if(now==0)ans=q1()*q6();
else if(now==1)ans=q2()*q6();
else if(now==2)ans=q1()*q5();
else if(now==3)ans=q1()*q6();
else if(now==5)ans=q2()*q5();
else if(now==6)ans=q1()*q5();
else if(now==7)ans=q1()*q5();
else if(now==8)ans=q2()*q5();
else ans=max(q3()*q5(),q4()*q6());
cout<<ans<<"\n";
}
return 0;
}