传送门
思路:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1000010];
int n,m;
int vis[2010];
int ansl,ansr;
bool check(int mid)
{
memset(vis,0,sizeof(vis));
int cnt = 0;
for(int i = 1; i <= mid; i++)
{
if(!vis[a[i]])
{
cnt++;
}
vis[a[i]]++;
}
if(cnt >= m)
{
ansl = 1,ansr = mid;
return true;
}
int flag = 0;
int y = 1;
while (mid < n)
{
vis[a[y]]--;
if (!vis[a[y]]) cnt--;
y++;
mid++;
vis[a[mid]]++;
if (vis[a[mid]] == 1) cnt++;
if (cnt == m)
{
ansl = y;ansr = mid;
return 1;
}
}
return false;
}
int main()
{
// freopen("C:\\Users\\76004\\Desktop\\新建文本文档.txt","r",stdin);
// freopen("C:\\Users\\76004\\Desktop\\新建文本文档2.txt","w",stdout);
cin>>n>>m;
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
}
int mid;
int l = 1,r = n;
while(l <= r)
{
mid = (l+r)>>1;
if(check(mid))
{
r = mid-1;
}
else
{
l = mid+1;
}
}
cout<<ansl<<" "<<ansr<<endl;
}