题目
首次了解到有尺取法这个东西,实际上就是双指针维护。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int n,m,x,sum,y=1e9,a[N],cnt[N];//用从cnt[i]维护区间每种画的个数
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
int l=1,r=1;//双指针扫描
while(l<=r&&r<=n){
while(sum<m&&r<=n){//移动右指针
if(!cnt[a[r]]) sum++;
cnt[a[r]]++;
r++;
}
if(sum<m) break;
if(r-l<y-x+1) x=l,y=r-1;//更新答案区间
//if((r-1)-l+1<y-x+1) x=l,y=r-1;
if(cnt[a[l]]==1) sum--;
cnt[a[l]]--;
l++;//移动左指针
}
cout<<x<<" "<<y;
return 0;
}