poj 3320
尺选法
#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; }