P1638 逛画展 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:双指针。固定右端点,移动左端点。如果左端点对应的值在左右范围内存在一个以上,左端点就向右进行移动,同时消除右端点对整个范围的影响。
void solve() {
int n,m; cin>>n>>m;
vector<int> a(n + 1), b(n + 1);
for(int i = 1; i <= n; ++i) cin>>a[i];
int mi = INF, l = 0, r = 0;
int cnt = 0;
for(int i = 1, j = 1; i <= n; ++i) {
if(b[a[i]] == 0) cnt++; b[a[i]]++;
while(b[a[j]] > 1) {
b[a[j]]--;
++j;
}
if(cnt == m && i - j + 1 < mi) mi = i - j + 1, l = j, r = i;
}
cout<<l<<" "<<r;
}