蒟蒻复习ST表,结果发现不会写了
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int INF = 2e9;
const int N = 1e5 + 10, Logn = 25;
int n, m, q, l1, r1, l2, r2, ans = -INF, logn[N];
int ST_Amax[N][Logn], ST_Amin[N][Logn];
int ST_AminusMax[N][Logn], ST_Aabove0Min[N][Logn];
int ST_Bmax[N][Logn], ST_Bmin[N][Logn];
int calc(int xx, int yy, int op){
if (op == 0) return max(xx, yy);
return min(xx, yy);
}
void Set_ST(int st[][Logn], int x){
for (int j = 1; j <= Logn; j++)
for (int i = 1; i + (1<<j) - 1 <= n; i++)
st[i][j] = calc(st[i][j-1], st[i+(1<<(j-1))][j-1], x);
}
int main(){
cin >> n >> m >> q;
for (int i = 1; i <= n; i++){
int x; cin >> x;
ST_Amin[i][0] = ST_Amax[i][0] = x;
ST_Aabove0Min[i][0] = (x>=0 ? x : INF);
ST_AminusMax[i][0] = (x<0 ? x: -INF);
}
for (int i = 1; i <= m; i++){
cin >> ST_Bmax[i][0];
ST_Bmin[i][0] = ST_Bmax[i][0];
}
logn[1] = 0, logn[2] = 1;
for (int i = 3; i <= max(n, m); i++)
logn[i] = logn[i>>1] + 1;
Set_ST(ST_Amax, 0);
Set_ST(ST_Amin, 1);
Set_ST(ST_AminusMax, 0);
Set_ST(ST_Aabove0Min, 1);
Set_ST(ST_Bmax, 0);
Set_ST(ST_Bmin, 1);
//cout << endl;
for (int i = 1; i <= q; i++){
cin >> l1 >> r1 >> l2 >> r2;
int s1 = logn[r1-l1+1], s2 = logn[r2-l2+1];
int amx = max(ST_Amax[l1][s1], ST_Amax[r1-(1<<s1)+1][s1]);
int amn = min(ST_Amin[l1][s1], ST_Amin[r1-(1<<s1)+1][s1]);
int azmn = min(ST_Aabove0Min[l1][s1], ST_Aabove0Min[r1-(1<<s1)+1][s1]);
int afmx = max(ST_AminusMax[l1][s1], ST_AminusMax[r1-(1<<s1)+1][s1]);
int bmx = max(ST_Bmax[l2][s2], ST_Bmax[r2-(1<<s2)+1][s2]);
int bmn = min(ST_Bmin[l2][s2], ST_Bmin[r2-(1<<s2)+1][s2]);
//cout << endl << amx << " " << amn << " " << afmx << " " << azmn << endl;
//cout << bmx << " " << bmn << endl << endl;
ans = -INF;
ans = max(ans, amx * (amx >= 0? bmn : bmx));
ans = max(ans, amn * (amn >= 0? bmn : bmx));
if (afmx != -INF)
ans = max(ans, afmx * bmx);
if (azmn != INF)
ans = max(ans, azmn * bmn);
cout << ans << endl /*<< endl*/;
}
return 0;
}
帮助者送关注,谢谢