2 条题解

  • 0
    @ 2025-7-16 19:53:39

    每个右端点调整到合适的左端点的双指针

    #include <bits/stdc++.h>
    using namespace std;
    int n, m;
    int a[1000000 + 5];
    int flag[2005]; // 记录每位画家的画出现了几次
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        int ansL, ansR;
        ansL = 1, ansR = n;
        // 一开始没有画
        int cnt = 0;
        for (int l = 1, r = 1; r <= n; r++)
        {
            // 当前的第 r 幅画是新加进来的
            flag[a[r]]++;
            if (flag[a[r]] == 1)
                cnt++;
            // 对于当前的右端点 r,把左端点 l 尽可能往右移
            while (flag[a[l]] > 1)
            {
                flag[a[l]]--;
                l++;
            }
            if (cnt == m)
            {
                if (r - l + 1 < ansR - ansL + 1 ||
                    r - l + 1 == ansR - ansL + 1 && l < ansL)
                    ansL = l, ansR = r;
            }
        }
        cout << ansL << " " << ansR << "\n";
        return 0;
    }
    
    

    信息

    ID
    2431
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    18
    已通过
    6
    上传者