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



題意:最も長い重複していない要素の区間の長さを求めます
考え方:このような問題のよくあるやり方は尺取法で、つまり左右の区間の端点を絶えず推進することであり、本題にとって、右の端点に重複要素が現れたら、私たちは左の端点を推進しなければならない.右の端点を推進し続けると重複要素が現れるからだ.
本題のもう一つの特徴は数の大きさが本題では役に立たないことであり、私たちは数の相対的な大きさを明確にするだけでよい.これは離散化の特徴に合致し、私たちは対数的に離散化を使用することができ、このように私たちは配列を使用して数のマークを行うことができ、マークが現れるかどうか.もちろんmapを使ってもいいですが、map(これもSTLの特徴です)はメモリの消費量が大きいです.
要するに,尺取法の有用性は大きいが,両ポインタの推進は区間問題の解決に効率的である.尺取法の使用にも柔軟です.
cinとscanfは絶対に混用しないで、T~
#include
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<