点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1000010,M=2010;
int n,m;
int ans,cnt,ansl,ansr;
int a[N],b[M];
inline void ins(int x)
{
if(b[x]==0) cnt++;
b[x]++;
}
inline void del(int x)
{
if(b[x]==1) cnt--;
b[x]--;
}
int main()
{
cin>>n>>m;
ans=n;
ansl=1,ansr=n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int r=1,l=1;r<=n;r++){
ins(a[r]);
while(l<=r){
del(a[l]);
if(cnt==m) l++;
else{
ins(a[l]);
break;
}
}
if(cnt==m&&r-l+1<ans){
ans=r-l+1;
ansl=l,ansr=r;
}
}
//要记得初始化ans1和ansr,因为判断条件是r-l+1<ans,最后相等是不会更新的
cout<<ansl<<" "<<ansr;
return 0;
}
滑动窗口双指针,不算难,算是扩展了一种处理方式