看题解里以及通过记录里的代码,开了4e6的结构体,里面存储4个long long数据,我算了一下空间需要120MB,但是为什么他们没有MLE,然后我的代码MLE了,把数组空间调成3*MAXN就过了
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int MAXN = 1e6 + 10;
int number[MAXN], w[MAXN], p[MAXN], pp[MAXN];
struct Node {
ll sum, lmst, rmst, mst;
Node(ll sum = 0, ll lmst = 0, ll rmst = 0, ll mst = 0) : sum(sum), lmst(lmst), rmst(rmst), mst(mst) {}
} node[MAXN << 2];
inline Node cb(Node a, Node b) {
return Node(a.sum + b.sum, max(a.lmst, a.sum + b.lmst), max(b.rmst, b.sum + a.rmst), max(max(a.mst, b.mst), a.rmst + b.lmst));
}
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
inline void ch(int x, int l, int r, int pos, ll num) {
if (l == r) {
node[x] = Node(num, num, num, num);
return;
}
int mid = l + r >> 1;
if (pos <= mid) ch(ls(x), l, mid, pos, num);
else ch(rs(x), mid + 1, r, pos, num);
node[x] = cb(node[ls(x)], node[rs(x)]);
}
int main() {
// freopen("input.txt", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> number[i];
for (int i = 1; i <= m; ++i) cin >> w[i];
memset(p, 0, sizeof(p));
memset(pp, 0, sizeof(pp));
ll ans = 0;
for (int i = 1; i <= n; ++i) {
if (pp[number[i]]) {
ch(1, 1, n, pp[number[i]], 0);
}
if (p[number[i]]) {
ch(1, 1, n, p[number[i]], -w[number[i]]);
}
ch(1, 1, n, i, w[number[i]]);
pp[number[i]] = p[number[i]];
p[number[i]] = i;
ans = max(ans, node[1].mst);
}
cout << ans << '\n';
return 0;
}