传送门:poj3320 Jessica's Reading Problem
#include<iostream>
#include<cstdio>
#include<set>
#include<map>
using namespace std;
const int maxp=1e6+10;
int P;
int a[maxp];
void solve(){
set<int> all;
for(int i=0;i<P;i++)
all.insert(a[i]);
int n=all.size();
//利用尺取法来求解
int s=0,t=0,num=0,res=P;
map<int,int> cnt;
while(true){
while(t<P&&num<n){
if(cnt[a[t++]]++==0){
num++; //出现新的知识点
}
}
if(num<n) break;
res=min(res,t-s);
if(--cnt[a[s++]]==0){
//某个知识点的出现次数为0了
num--;
}
}
printf("%d\n",res);
}
int main(){
scanf("%d",&P);
for(int i=0;i<P;i++)
scanf("%d",&a[i]);
solve();
return 0;
}