尺选法
#include <iostream>
#include <set>
#include <map>
using namespace std;
const int MAX_P = 1000005;
int p;
int a[MAX_P];
void solve() {
set<int> all;
for(int i=0; i<p; i++)
all.insert(a[i]);
int n = all.size();
int i=0, j=0, num=0;
map<int, int> count;
int res = p;
for(;;) {
while(j<p && num<n)
if(count[a[j++]]++ == 0)
num++;
if(num < n) break;
res = min(res, j-i);
if(--count[a[i++]] == 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;
}