P1638 逛画展

Posted garen-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1638 逛画展相关的知识,希望对你有一定的参考价值。

two pointers练习题。

这道题求的是一个最短的区间长度,满足其中所有的数字都出现。

暴力的做法是两次枚举,复杂度(O(n^2))

更优美的是尺取法,英文名叫two pointers。(两个指针。。。)

算法大概的过程是这样的:

while(左指针不越界)
{
    while(不满足题目条件 && 右指针不越界)
    {
        右指针++
        加入右指针所指元素
    }
    更新答案
    删除掉左指针所指元素
    左指针++
}

其实真的是很优美的,代码也很短。

希望我能真的学会吧。。。

代码:

#include<cstdio>

const int maxn = 1000005;
int a[maxn];
int vis[maxn];
int cnt, ansa, ansb = maxn;
int n, m;
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    int l = 1, r = 1;
    vis[a[1]]++; cnt++;
    while(l <= n)
    {
        while(cnt != m)
        {
            r++;
            if(r > n) break;
            if(!vis[a[r]]) cnt++;
            vis[a[r]]++;
        }
        if(r - l + 1 < ansb - ansa + 1)
        {
            ansa = l; ansb = r;
        }
        if(vis[a[l]] == 1) cnt--;
        vis[a[l]]--;
        l++;
    }
    printf("%d %d
", ansa, ansb);
    return 0;
}

以上是关于P1638 逛画展的主要内容,如果未能解决你的问题,请参考以下文章

P1638 逛画展(直尺法)

逛画展

Luogu1638逛画展

luogu_P1638 逛画展

逛画展

生日礼物