思路就是先让小L选一行,因为小Q要使得分最小所以枚举L2-R2的最小值(一行),接着再枚举L1-R1的每行最小值中的最大值
#include <bits/stdc++.h>
using namespace std;
long long min(long long A[], long long B[], long long l1, long long r1, long long l2, long long r2) {
long long max = A[l1] * B[l2];
if(l1 == r1) {
for(long long j = l2; j <= r2;j++) {
if(A[l1] * B[j] < max) {
max = A[l1] * B[j];
}
}
}
else if(l2 == r2) {
for(long long i = l1;i <= r1;i++) {
if(A[i] * B[l2] > max) {
max = A[i] * B[l2];
}
}
}
else {
for(long long i = l1; i <= r1;i++) {
long long min = A[i] * B[l2];
for(long long j = l2; j <= r2;j++) {
if(A[i] * B[j] < min) {
min = A[i] * B[j];
}
}
if(i == l1) {
max = min;
}
if(min > max)
max = min;
}
}
return max;
}
int main() {
freopen("game.in", "r", stdin);
freopen("game.out", "w", stdout);
long long n, m, q;
cin>>n>>m>>q;
long long A[n + 1];
long long B[m + 1];
for(long long i = 1;i <= n;i++) {
cin>>A[i];
}
for(long long j = 1;j <= m;j++) {
cin>>B[j];
}
for(long long i = 0;i < q;i++) {
long long l1, r1, l2, r2;
cin>>l1>>r1>>l2>>r2;
cout<<min(A, B, l1, r1, l2, r2)<<endl;
}
return 0;
}
不会st表,不会线段树,想从正负性方面优化,不知道可不可以