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;
}

猜你喜欢

转载自www.cnblogs.com/Garen-Wang/p/9833356.html