解题思路:题目要求,第a幅画和第b幅画之间的所有图画,至少包含每位画师的一张画;
用cnt[N]存储a~b之间每位画师画作的个数,利用双指针算法,两指针同时移动,看区间内的条件是否满足要求。
#include<iostream>
using namespace std;
const int N = 1000010, M = 2010;
int cnt[M], a[N], n, m;//cnt记录名师画作个数,a[N]记录编号
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i];
int h = 1, t = 1, num = 0, res = n, l = 1, r = n;
while(1)
{
while(t <= n && num < m)
{
if(cnt[a[t]] == 0) num++;
cnt[a[t]]++;
t++;
}
if(num < m)
break;
if(res > t - h)
{
res = t - h;
l = h;
r = t - 1;
}
--cnt[a[h]];
if(cnt[a[h]] == 0) num--;
h++;
}
cout << l << ' ' << r << endl;
return 0;
}