【UVA】Unique Snowflakes UVA - 11572 (离散化+尺取法)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43238423/article/details/102732561

题意:求最长无重复元素的区间长度

思路:这类问题常见的做法就是尺取法,即不断推进左右区间端点,对于本题来说,如果右端点有重复元素出现,我们必须推进左端点,因为继续推进右端点还是会有重复元素出现。

本题的又一特征是数的大小在本题是无用的,我们只需要明确数的相对大小即可,这正符合离散化的特征,我们可以对数使用离散化,这样我们就可以使用数组进行数的标记,标记是否出现。当然使用map也是可以的,只是map(这也是STL的特点)对于内存的消耗是很大的。

总之,尺取法的用处还是很大的,两个指针的推进对于区间问题的解决是效率很高的。对于尺取法的使用也是很灵活的。

cin和scanf千万别混用,会T~

#include<bits/stdc++.h>
using namespace std;
const int Maxn=1e6+10;
const int inf=0x3f3f3f3f;
int t,n,a[Maxn],b[Maxn],flag[Maxn];
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            b[i]=a[i];
        }
    }
    sort(b+1,b+1+n);
    int cnt=unique(b+1,b+1+n)-b-1;
    for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;
    int ans=1;
    int l=1;int r=2;
    flag[a[1]]++,flag[a[2]]++;
    while(r<=n)
    {
        while(flag[a[r]]>1)
        {
            flag[a[l++]]--;
        }
        ans=max(ans,r>n?r-l:r-l+1);
        flag[a[++r]]++;
    }
    cout<<ans;
}

猜你喜欢

转载自blog.csdn.net/weixin_43238423/article/details/102732561