#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) }}

  • 正确
  • 错误