P1638 逛画展

  显然数据只能nlogn以下。

  其实O(n)就能做。

  对于一个数,我们维护它最后出现的位置p [ ] 。那么对于L~R(假设已经达到m种画都有),R+1时,至少一个数的p会被更新。那么如果这个左端点在这个区间中还有一个,即 L < p [ a [ L ] ] ,那么这个L删掉是没有影响的,我们就让L++;否则L不变,这样保证这个队伍里必定1~m都有,更新答案即可。

  对于时间复杂度,显然L,R分别最多只会移动n次,所以为O(n)。

  代码:

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std; 
#define maxn 1000005
#define inf 99999999
int a[maxn],p[maxn];
int n,m,tot,L=0,R=inf;
int main()
{
    scanf("%d%d",&n,&m);
    int l=1;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(!p[a[i]]) tot++;
        p[a[i]]=i;
        while(l<p[a[l]]) l++;
        if(tot==m&&R-L+1>i-l+1)
        {
            L=l;
            R=i;
        }
    }
    printf("%d %d",L,R);
    return 0;
}
原文地址:https://www.cnblogs.com/popo-black-cat/p/10759550.html