m
a
x
a
[
i
]
maxa[i]
maxa[i]表示
m
a
x
max
max
(
a
[
j
]
)
(a[j])
(a[j])(
j
j
j&
i
>
=
i
i>=i
i>=i)
由于可能出现负数,所以还要处理最小值
预处理出
m
a
x
a
,
m
a
x
b
,
m
i
n
a
,
m
i
n
b
maxa,maxb,mina,minb
maxa,maxb,mina,minb
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int mod = 998244353, N = 1 << 19;
typedef long long ll;
int t, n;
int a[N], b[N];
ll c[N];
int maxa[N], mina[N], maxb[N], minb[N];
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 0; i < n; ++i)scanf("%d", &a[i]), maxa[i] = mina[i] = a[i];
for (int i = 0; i < n; ++i)scanf("%d", &b[i]), maxb[i] = minb[i] = b[i];
c[n] = -(1ll << 62);
for (int i = n - 1; i >= 0; i--)
for (int j = 0; (1 << j) < n; j++) {
if ((i | (1 << j)) >= n)continue;
maxa[i] = max(maxa[i], maxa[i | (1 << j)]);
maxb[i] = max(maxb[i], maxb[i | (1 << j)]);
mina[i] = min(mina[i], mina[i | (1 << j)]);
minb[i] = min(minb[i], minb[i | (1 << j)]);
}
int res = 0;
for (int i = n - 1; i >= 0; i--) {
c[i] = max({c[i + 1],
(ll) maxa[i] * maxb[i],
(ll) maxa[i] * minb[i],
(ll) mina[i] * maxb[i],
(ll) mina[i] * minb[i]});
res = (res + c[i]) % mod;
}
printf("%d\n", (res + mod) % mod);
}
return 0;
}