zoukankan      html  css  js  c++  java
  • Codeforces Educational Codeforces Round 5 D. Longest k-Good Segment 尺取法

    D. Longest k-Good Segment

    题目连接:

    http://www.codeforces.com/contest/616/problem/D

    Description

    The array a with n integers is given. Let's call the sequence of one or more consecutive elements in a segment. Also let's call the segment k-good if it contains no more than k different values.

    Find any longest k-good segment.

    As the input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to use scanf/printf instead of cin/cout in C++, prefer to use BufferedReader/PrintWriter instead of Scanner/System.out in Java.

    input

    The first line contains two integers n, k (1 ≤ k ≤ n ≤ 5·105) — the number of elements in a and the parameter k.

    The second line contains n integers ai (0 ≤ ai ≤ 106) — the elements of the array a.

    Output

    Print two integers l, r (1 ≤ l ≤ r ≤ n) — the index of the left and the index of the right ends of some k-good longest segment. If there are several longest segments you can print any of them. The elements in a are numbered from 1 to n from left to right.

    Sample Input

    5 5

    1 2 3 4 5

    Sample Output

    1 5

    Hint

    题意

    给你n个数,你需要找到一个最长的区间,使得这个区间里面不同的数小于等于k个

    题解:

    尺取法扫一遍就好了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    #define maxn 1000005
    int a[maxn];
    int vis[maxn];
    int main()
    {
        int n,k;scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int al=0,ar=0,ans=0,now=0,l=1;
        for(int i=1;i<=n;i++)
        {
            vis[a[i]]++;
            if(vis[a[i]]==1)now++;
            while(now>k)
            {
                vis[a[l]]--;
                if(vis[a[l]]==0)
                    now--;
                l++;
            }
            if(i-l+1>=ar-al+1)
                ar=i,al=l;
        }
        cout<<al<<" "<<ar<<endl;
    }
  • 相关阅读:
    PHP线程安全和非线程安全有什么区别
    SHOW SLAVE STATUS 详解
    linux 2>&1
    crontab 例行性排程
    clang-format 数组初始化,多行模式
    windows 10 1909 无法启用 .NET Framework 解决
    SysCtlDelay 实现延时
    wpa_supplicant 检测错误密码
    swig python dynamic module does not define init function
    讯飞错误码10116
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5127216.html
Copyright © 2011-2022 走看看