Longest k-Good Segment

题意:
求含有K个不同数的最长区间的左右端点(任意一组)

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    int n, a[1000010], vis[1000010], i, num = 0;
    int l = 1, r = 1, k, len = 0, x, y, j;
    cin>>n>>k;
    memset(vis, 0, sizeof(vis));
    for(i = 1; i <= n; i++)
    {
        cin>>a[i];
        if (!vis[a[i]])
            num++;//区间内不同的数的个数
        vis[a[i]]++;//每个数出现的次数
        if (num >  k)//如果不同的数的个数大于给出的k就会进行判断
        {
            for(j = l; j <= r; j++)//查找当前区间内
            {
                vis[a[j]]--;
                if (!vis[a[j]])//如果最左端的数只有一个(没有重复的),左端点l右移
                {
                    num--;
                    l = j+1;//l往后移,用新加进来的代替最左端的
                    break;
                }
            }
        }
        r = i;//更新右端点
        if (r-l+1 > len)//每次更新最长序列的左右端点
        {
            len = r-l+1;//区间长度
            x = l;//左端点
            y = r;//右端点
        }
    }
    cout<<x<<' '<<y<<endl;
    return 0;
}




发布了29 篇原创文章 · 获赞 4 · 访问量 4707

猜你喜欢

转载自blog.csdn.net/onion___/article/details/79110206
今日推荐