zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    基本命令
    Unicode Locale
    二进制查看编辑
    java reg
    java util
    js util
    跑到X
    [转]Linux AIO :libaio
    [转]c++ atomic操作
    [转] dpdk笔记
  • 原文地址:https://www.cnblogs.com/popo-black-cat/p/10759550.html
Copyright © 2011-2022 走看看