WA 掉了 40pts
大概思路就是 r 从 1 到 n,然后再 l 从 1 到 n,维护前缀最大值
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long ll;
int n, m, a[1000007], h[1000007], nxt[1000007];
int vis[1000007];
ll ans, tr[4000007], mx[4000007], w[1000007];
inline int ls(int x){return x << 1;}
inline int rs(int x){return x << 1 | 1;}
inline void pushup(int p)
{
tr[p] = tr[ls(p)] + tr[rs(p)];
mx[p] = std::max(mx[ls(p)], tr[ls(p)] + mx[rs(p)]);
}
void update(int idx, ll k, int p = 1, int l = 1, int r = n)
{
if(l == r)
{
tr[p] = mx[p] = k;
return;
}
int mid = (l + r) >> 1;
if(idx <= mid) update(idx, k, ls(p), l, mid);
if(idx > mid) update(idx, k, rs(p), mid + 1, r);
pushup(p);
}
ll query(){return mx[1];}
int main()
{
// freopen("film.in", "r", stdin);
// freopen("film.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= m; i++)
scanf("%lld", &w[i]);
for(int i = 1; i <= m; i++)
h[i] = -1;
for(int i = n; i >= 1; i--)
nxt[i] = h[a[i]], h[a[i]] = i;
for(int i = 1; i <= n; i++)
{
const int val = a[i];
if(!vis[val])
update(i, w[val]);
else if(vis[val] == 1)
update(i, -w[val]);
++vis[val];
}
ans = std::max(ans, query());
for(int i = 1; i < n; i++)
{
int val = a[i];
update(i, 0);
val = nxt[val];
if(~val)
{
update(i, w[val]);
val = nxt[val];
}
if(~val)
update(i, -w[val]);
ans = std::max(ans, query());
}
printf("%lld\n", ans);
return 0;
}