1026 String of Colorful Beads

知识点:尺取法

这个题的模型就是给一个序列,求出其中最长的元素不重复的连续子列的长度,只不过在这之上加了一个第二标尺,就是价值,然后就是做题的时候这个价值的下标一定不要搞错,第二行输入的数据就是价值的下标,这点要注意,

所以这个题就可以用尺取法去做了,尺取法的标准的步骤就是4个,移动右坐标,判断退出,更新答案,移动左坐标,但是判断退出和更新答案的顺序是不一定的,这个模型下面我的写法就是先更新答案,然后判断退出,通常退出的条件需要你根据题目给的性质条件自己去想,没有固定的套路,然后这道题就是在更新答案的时候稍微注意一下有第二标尺就行了,

15分钟过了这个题,这道题应该比洛谷上的黄题难一点,

#include <bits/stdc++.h>

using namespace std;

const int N = 1e4 + 5;

int main() {
	int n;
	cin >> n;
	int a[N], b[N];
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) cin >> b[i];
	int l = 1, r = 1;
	int len = 0;
	int val = 0;
	int ans = 0, L, R;
	map<int, int> mp;
	while (true) {
		while (r <= n && !mp[b[r]]) {
			val += a[b[r]];
		    mp[b[r++]] = 1;
		}
		if (r - l > len) {
			len = r - l;
			ans = val;
			L = l - 1;
			R = r - 2;
		} else if (r - l == len && val > ans) {
			ans = val;
			L = l - 1;
			R = r - 2;
		}
		if (r == n + 1) break;
		while (l <= n && b[l] != b[r]) {
			val -= a[b[l]];
			mp[b[l++]]--;
		}
		val -= a[b[l]];
		mp[b[l++]]--;
	}
	cout << ans << " " << L << " " << R;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值