Jessicas Reading Problem

選擇長度最小的子段,使得包含所有出現的元素 

//#pragma GCC optimize(2)
//#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#define rush() int T;cin>>T;while(T--)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
#define sd(a) scanf("%d",&a)
#define pd(a) printf("%d\n",a)
#define debug(a) cout<<"*"<<a<<"*"<<endl
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define PAUSE system("pause")
using namespace std;
typedef long long ll;
typedef unsigned ui;
typedef unsigned long long ull;
typedef pair<int,int> Pair;
const int inf=0x7f7f7f7f;
const int mod=100003;
const int N=1e6+5;

    int n,m,t;
    int i,j,k;
    int a[N];
    set<int> s;
    map<int,int> mp;

int main()
{
    //IOS;
    while(~sd(n)){
        for(i=0;i<n;i++){
            sd(a[i]);
            s.insert(a[i]);
        }
        int ans=n;
        int sum=s.size(),num=0,s=0,e=0;
        while(true){
            while(e<n && num<sum)
                if(mp[a[e++]]++==0) num++;
                //相當於 mp[a[e]]==0; mp[a[e]]++; e++;
            if(num<sum) break;
            ans=min(ans,e-s);
            if(mp[a[s++]]--==1) num--;
            //mp[a[s]]==1; mp[a[s]]--; s++;
        }
        pd(ans);
        //break;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章