mxqz
查看原帖
mxqz
411560
NobodyThere楼主2022/8/9 21:51

WA 掉了 40pts

大概思路就是 rr11nn,然后再 ll11nn,维护前缀最大值

#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;
}
2022/8/9 21:51
加载中...