思路:定义双指针x和y代表【x,y】区间,初始化x=y=0开始遍历,刚开始时一直增加y直到包含了所有作家的画,然后就从左边x开始删区间有重复作家的画就行。注意不要把任何一个作家的画删到0!!
代码如下
#include <iostream>
#include <algorithm>
using namespace std;
int arr[1000005];
int co[1000005];//co[i]代表在当前区间第i个作家的画数
int flag;
int main()
{
int n, m, ans = 0x3f3f3f3f;
cin >> n >> m;
int x = 1, ansx, ansy;//区间为【x,y】但y在后面有循环来代替了
int cnt = 0;//当前区间包含了cnt个作家
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
}
for (int i = 1; i <= n; i++)//i代表区间右端y
{
if (++co[arr[i]] == 1)//第一次收录该作家的画
cnt++;
if (cnt == m)
{
while (co[arr[x]] > 1)
{//如果左边x指的画还有同作者的画那就可以删左边的画
co[arr[x]]--;
x++;
}
if (ans > i - x)
{//更新更省钱的方案
ansy = i;
ansx = x;
ans = i - x;
}
}
}
cout << ansx << " " << ansy << endl;
return 0;
}