Sun, 04 Aug 2019 14:04:44 +0800

master
大蒟蒻 6 years ago
parent 98565ebf8a
commit 946125fe06

@ -18,6 +18,7 @@ struct SegTree
struct Node
{
ll sum, lmx, lmn, rmx, rmn;
void init(const int x) { sum = x, lmx = x, lmn = x, rmx = x, rmn = x; }
} N[sz << 2];
void merge(Node &c, Node &l, Node &r)
{
@ -27,17 +28,17 @@ struct SegTree
c.lmx = max(l.lmx, l.sum + r.lmx);
c.rmx = max(r.rmx, r.sum + l.rmx);
}
void update(int k) { merge(N[k], N[L(k)], N[R(k)]); }
void build(int k, int l, int r, int *a)
{
if (l == r - 1) return void(N[k].mn = N[k].mx = 1);
if (l == r - 1) return N[k].init(a[l]);
int m = avg(l, r);
build(L(k), l, m, a);
build(R(k), m, r, a);
update(k);
merge(N[k], N[L(k)], N[R(k)]);
}
Node query(int k, int l, int r, int x, int y)
{
if (x >= y) return {};
if (x <= l && r <= y) return N[k];
int m = avg(l, r);
if (y <= m) return query(L(k), l, m, x, y);
@ -68,35 +69,28 @@ int main()
scanf("%d", &n);
for (int i = 1; i <= n; i++) read(a[i]);
for (int i = 1; i <= n; i++) read(b[i]);
a[0] = a[n + 1] = -inf;
v.clear(), v.push_back(0);
for (int i = 1; i <= n; i++)
{
while (a[v.back()] > a[i]) v.pop_back();
l[i] = v.back();
v.push_back(i);
while (a[v.back()] >= a[i]) v.pop_back();
l[i] = v.back(), v.push_back(i);
}
v.clear(), v.push_back(n + 1);
for (int i = n; i >= 1; i--)
{
while (a[v.back()] > a[i]) v.pop_back();
r[i] = v.back();
v.push_back(i);
while (a[v.back()] >= a[i]) v.pop_back();
r[i] = v.back(), v.push_back(i);
}
/*for (int i = 1; i <= n; i++) printf("%2d ", a[i]);
putchar('\n');
for (int i = 1; i <= n; i++) printf("%2d ", l[i]);
putchar('\n');
for (int i = 1; i <= n; i++) printf("%2d ", r[i]);
putchar('\n');*/
st.build(1, 0, n, b + 1);
long long ans = 0;
for (int i = 1; i <= n; i++)
{
int lb = l[i] + 1, rb = r[i];
auto resl = st.query(1, 0, n, lb, i);
auto resr = st.query(1, 0, n, i, rb);
ans = max(ans, a[i] < 0 ? a[i] * (resl.rmn + a[i] + resr.lmn) :
a[i] * (resl.rmx + a[i] + resr.lmx));
auto resl = st.query(1, 0, n, l[i], i - 1);
auto resr = st.query(1, 0, n, i, r[i] - 1);
ans = max(ans, a[i] < 0 ? a[i] * (resl.rmn + b[i] + resr.lmn) :
a[i] * (resl.rmx + b[i] + resr.lmx));
}
printf("%lld", ans);
return 0;
}

@ -1,20 +0,0 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "cl.exe build and debug active file",
"type": "cppvsdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"preLaunchTask": "cl.exe build active file"
}
]
}

@ -1,18 +0,0 @@
{
"tasks": [
{
"type": "shell",
"label": "cl.exe build active file",
"command": "cl.exe",
"args": [
"/ID:\\PortableApps\\MSYS2\\mingw64\\include\\c++\\9.1.0\\x86_64-w64-mingw32",
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"${file}"
]
}
],
"version": "2.0.0"
}
Loading…
Cancel
Save