#13118. 珅泽教育CSP-J第一轮模拟考第二十九套 第 19 题
珅泽教育CSP-J第一轮模拟考第二十九套 第 19 题
二、程序阅读题(第 16—18 大题,共 18 个小题,40 分)
程序阅读(区间内恰含 m 种不同元素)
数据范围:1≤n≤10^6,1≤a_i≤2×10^3
#include <bits/stdc++.h>
using namespace std;
int flag[2005], n, m, a[1000005], cnt;
int ansL, ansR;
bool check(int x) {
cnt = 0;
memset(flag, 0, sizeof flag);
for (int i = 1; i <= x; i++) {
if (!flag[a[i]]) cnt++;
flag[a[i]]++;
}
if (cnt == m) {
ansL = 1, ansR = x;
return 1;
}
int y = 1;
while (x < n) {
flag[a[y]]--;
if (!flag[a[y]]) cnt--;
y++, x++;
flag[a[x]]++;
if (flag[a[x]] == 1) cnt++;
if (cnt == m) {
ansL = y, ansR = x;
return 1;
}
}
return 0;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
int l = 1, r = n;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid - 1;
else l = mid + 1;
}
printf("%d %d\n", ansL, ansR);
return 0;
}
若输入样例为 3 3 / 1 2 3,那么把程序第 16 行至第 27 行删去,输出不会改变。
{{ select(1) }}
- 正确
- 错误