2022.5.7 AcWing每日一题

双指针 + unordered_map

具有相同ID的最大奶牛连续段 等价于
只具有两种奶牛的连续段中的较长的一个

完备性:即使对原来的整个长度多种ID进行删除操作,
中间有第三种ID的位置也无法链接在一起
比如:2352 删除3 或 5,2还是无法链接在一起
所以只需要维护ID为两种的区间即可。

正确性:例如 2357272727 ,当右端点确定的时候,由于只能
出现两种ID,其实左端点的最优解是被唯一确定了的,而且
由于该问题是线性最优问题,不会出现左端点逆向更优的
情况,所以使用双指针算法是正确的算法。

#include <bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;

/*
双指针 + map映射

具有相同ID的最大奶牛连续段 等价于
只具有两种奶牛的连续段中的较长的一个

完备性:即使对原来的整个长度多种ID进行删除操作,
中间有第三种ID的位置也无法链接在一起
比如:2352 删除3 或 5,2还是无法链接在一起
所以只需要维护ID为两种的区间即可。

正确性:例如 2357272727 ,当右端点确定的时候,由于只能
出现两种ID,其实左端点的最优解是被唯一确定了的,而且
由于该问题是线性最优问题,不会出现左端点逆向更优的
情况,所以使用双指针算法是正确的算法。
*/

int n;
int w[N];
unordered_map<int, int>mp;

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &w[i]);
	}
	int cnt = 0;
	int res = 0;

	for (int i = 0, j = 0; i < n; i++) {
		mp[w[i]]++;
		if (mp[w[i]] == 1)
			cnt++;
		while (j < i && cnt > 2) {
			if (--mp[w[j]] == 0)
				cnt--;
			j++;
		}
		for (auto [x, c] : mp) {
			res = max(res, c);
		}
	}
	cout << res << endl;

	return 0;
}

posted @ 2022-05-07 10:15  superPG  阅读(28)  评论(0编辑  收藏  举报