P1638 逛画展

原题链接

反思,debug不出来就赶紧看题解把!

题解

双指针,双指针有好几种,这个是像弹簧(窗口)一样的双指针,右指针一直往右走,当成立时,左指针一直往左走直到不成立

code

#include<bits/stdc++.h>
using namespace std;
int a[1000006]={0};
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    map<int,int> cnt;
    int l=1,minlen=n+1,ends,uni=0,start;
    for(int i=1;i<=n;i++)
    {
        if(cnt[a[i]]++==0)uni++;
        while(uni==m)
        {
            if(i-l+1<minlen)
            {
                minlen=i-l+1;
                start=l;
                ends=i;
            }
            if(--cnt[a[l++]]==0)uni--;
        }
    }
    cout<<start<<" "<<ends;
    return 0;
}

posted @ 2024-01-16 18:22  纯粹的  阅读(20)  评论(0)    收藏  举报