本来没加ST表,想试一下我的模型对不对,然后一直0分WA,加了long long就对了,60分,TLE最后40分
然后就开始往里套ST表,结果又变回0分WA了,而且错误和一开始一模一样,可是开long long了,求助。
可以给3个关注QwQ
# include<iostream>
# include<algorithm>
# include<cmath>
# include<iomanip>
# include<cstdio>
# define endl "\n"
# define int long long
using namespace std;
const int maxn=100001, INF=1000000001;
int n, m, q;
int l1, r1, l2, r2;
int maxa[maxn][21], mina[maxn][21], maxb[maxn][21], minb[maxn][21], minPos[maxn][21], maxNeg[maxn][21];
bool za[maxn][21], zb[maxn][21];
int log(int x) {
int ans=0, now=1;
while(now*2<=x) {
ans++, now*=2;
}
return ans;
}
signed main() {
cin >> n >> m >> q;
for(int i=1; i<=n; i++) {
cin >> maxa[i][0];
mina[i][0]=maxa[i][0];
minPos[i][0]=(maxa[i][0]>0 ? maxa[i][0] : INF);
maxNeg[i][0]=(maxa[i][0]<0 ? maxa[i][0] : -INF);
if(maxa[i][0]==0) za[i][0]=true;
}
for(int i=1; i<=m; i++) {
cin >> maxb[i][0];
minb[i][0]=maxb[i][0];
if(maxb[i][0]==0) zb[i][0]=true;
}
for(int j=1; j<=17; j++) {
for(int i=1; i+pow(2, j)-1<=n; i++) {
maxa[i][j]=max(maxa[i][j-1], maxa[i+(1<<(j-1))][j-1]);
mina[i][j]=min(maxa[i][j-1], maxa[i+(1<<(j-1))][j-1]);
maxNeg[i][j]=max(maxNeg[i][j-1], maxNeg[i+(1<<(j-1))][j-1]);
minPos[i][j]=min(minPos[i][j-1], minPos[i+(1<<(j-1))][j-1]);
za[i][j]=(za[i][j-1] || za[i+(1<<j-1)][j-1]);
}
}
for(int j=1; j<=17; j++) {
for(int i=1; i+pow(2, j)-1<=m; i++) {
maxb[i][j]=max(maxb[i][j-1], maxb[i+(1<<(j-1))][j-1]);
minb[i][j]=min(maxb[i][j-1], maxb[i+(1<<(j-1))][j-1]);
zb[i][j]=(zb[i][j-1] || zb[i+(1<<j-1)][j-1]);
}
}
while(q--) {
cin >> l1 >> r1 >> l2 >> r2;
bool pos1=false, neg1=false, pos2=false, neg2=false, zero1=false, zero2=false;
int max1, max2, min1, min2, pos_min1, neg_max1;
int log1=log(r1-l1+1), log2=log(r2-l2+1);
int t1=r1-(1 << log1)+1, t2=r2-(1 << log2)+1;
max1=max(maxa[l1][log1], maxa[t1][log1]);
max2=max(maxb[l2][log2], maxb[t2][log2]);
min1=min(mina[l1][log1], mina[t1][log1]);
min2=min(minb[l2][log2], minb[t2][log2]);
neg_max1=max(maxNeg[l1][log1], maxNeg[t1][log1]);
pos_min1=min(minPos[l1][log1], minPos[t1][log1]);
zero1=(za[l1][log1] || za[t1][log1]);
zero2=(zb[l2][log2] || zb[t2][log2]);
if(max1>0) pos1=true;
if(min1<0) neg1=true;
if(max2>0) pos2=true;
if(min2<0) neg2=true;
if(pos2==true && neg2==false) {
if(pos1==true)
if(!zero2) cout << max1*min2 << endl;
else cout << 0 << endl;
else
if(!zero1) cout << max1*max2 << endl;
else cout << 0 << endl;
} else if(pos2==false && neg2==true) {
if(neg1==true)
if(!zero2) cout << min1*max2 << endl;
else cout << 0 << endl;
else
if(!zero1) cout << min1*min2 << endl;
else cout << 0 << endl;
} else {
if(zero1) cout << 0 << endl;
else if(pos1==false) cout << max1*max2 << endl;
else if(neg1==false) cout << min1*min2 << endl;
else cout << max(pos_min1 * min2, neg_max1 * max2) << endl;
}
}
return 0;
}