UVA11572 Unique Snowflakes

vjudge真好用。。。

一句话的题意:给你一个数组,求无重复元素的最长区间长度。

可以发现:区间越长,重复元素会越多。反之亦然。

直接使用two-pointers就可以求解。

具体实现思路是:先移动右端点直至出现重复元素,然后再移动左端点直至没有重复元素。

复杂度依然十分优美。

PS:这道题没跟数据范围是真的捞,\(N \leq 1000000\)

代码:

#include<cstdio>
#include<map>
#include<algorithm>
const int maxn = 1000005;
int a[maxn], n;
int ans;
int read()
{
	int ans = 0, s = 1;
	char ch = getchar();
	while(ch > '9' || ch < '0'){ if(ch == '-') s = -1; ch = getchar(); }
	while(ch >= '0' && ch <= '9') ans = (ans << 3) + (ans << 1) + ch - '0', ch = getchar();
	return s * ans;
}
void two_pointers()
{
	int l = 1, r = 0;
	ans = 0;
	std::map<int,int> mmp;
	while(r <= n)
	{
		mmp[a[r]]++;
		if(mmp[a[r]] == 2)
		{
			while(l <= n)
			{
				mmp[a[l]]--;
				l++;
				if(mmp[a[r]] == 1)
				{
					ans = std::max(ans, r - l + 1);
					break;
				}
			}
		}
		else ans = std::max(ans, r - l + 1);
		r++;
	}
}
int main()
{
	int T = read();
	while(T--)
	{
		n = read();
		for(int i = 1; i <= n; i++) a[i] = read();
		two_pointers();
		printf("%d\n", ans);
	}
	return 0;
}
posted @ 2018-10-22 21:53  Garen-Wang  阅读(148)  评论(0编辑  收藏  举报