天天看点

P1638 逛画展

​​传送门​​

思路:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int a[1000010];
int n,m;
int vis[2010];
int ansl,ansr;
bool check(int mid)
{
    memset(vis,0,sizeof(vis));
    int cnt = 0;
    for(int i = 1; i <= mid; i++)
    {
        if(!vis[a[i]])
        {
            cnt++;
        }
        vis[a[i]]++;
    }
    if(cnt >= m)
    {
        ansl = 1,ansr = mid;
        return true;
    }
    int flag = 0;
    int y = 1;
    while (mid < n) 
    {
        vis[a[y]]--;
        if (!vis[a[y]]) cnt--;
        y++;
        mid++;
        vis[a[mid]]++;
        if (vis[a[mid]] == 1) cnt++;
        if (cnt == m) 
        {
            ansl = y;ansr = mid;
            return 1;
        }
    }
    return false;
}
int main()
{
//  freopen("C:\\Users\\76004\\Desktop\\新建文本文档.txt","r",stdin);
//  freopen("C:\\Users\\76004\\Desktop\\新建文本文档2.txt","w",stdout);
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
    {
        scanf("%d",&a[i]);
    }
    int mid;
    int l = 1,r = n;
    while(l <= r)
    {
        mid = (l+r)>>1;
        if(check(mid))
        {
            r = mid-1;
        }
        else
        {
            l = mid+1;
        }
    }

    cout<<ansl<<" "<<ansr<<endl;
}