上题目:(原题链接:P1638 逛画展 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
没学过队列,一开始看这题有点懵,看了题解神犇的解答恍然大悟。只需要每次往后读数据的时候维护一下队列就好。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int a[2001], b[1000000], n, m, left, right, head, i, length, cnt = 0;
int main()
{
scanf("%d %d", &n, &m);
head = 0;
for (i = 0; i < n; i++)scanf("%d", &b[i]);
for (i = 0; i < n; i++)
{
if (a[b[i]] == 0)++cnt;
++a[b[i]];
if (cnt == m)
{
while (a[b[head]] > 1)
{
--a[b[head]];
++head;
}
length = i - head;
left = head, right = i;
break;
}
}
for (i = i + 1; i < n; i++)
{
++a[b[i]];
if (a[b[head]] > 1)
{
while (a[b[head]] > 1)
{
--a[b[head]];
++head;
}
if (length > i - head)
{
length = i - head;
left = head, right = i;
}
}
}
printf("%d %d\n", left + 1, right + 1);
return 0;
}