180E - Cubes DP 优先队列

来源:互联网 发布:渐飞财报数据 编辑:程序博客网 时间:2024/05/18 01:30

题意:最多去掉序列中的k个数字,使序列中有尽可能长的一部分,其中的数字都相同,求这种序列的最大长度。

做法:优先队列,发现所有情况都要记录下来的,而且第一个元素还有着重考虑一下WA翻...

#include <iostream>#include <deque>#include <cstdio>#include <algorithm>const int LMT=100005;using namespace std;deque<int>q[LMT];int a[LMT<<1],l[LMT],pro[LMT],d[LMT],pre[LMT];int main(){    int n,m,k,ans=0;    cin>>n>>m>>k;    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        q[a[i]].push_back(i);    }    for(int i=1;i<=n;i++)l[a[i]]=1;    for(int i=1;i<=n;i++)    {       if(pro[a[i]]&&i<=pre[a[i]])//多了个分号,受不鸟...        d[a[i]]-=i-pro[a[i]]-1;        pro[a[i]]=i;       if(!q[a[i]].empty()&&q[a[i]].front()==i)       {          q[a[i]].pop_front();          pre[a[i]]=i;          l[a[i]]=1;       }        while(!q[a[i]].empty())        {            if(d[a[i]]+q[a[i]].front()-pre[a[i]]-1>k)                break;            d[a[i]]+=q[a[i]].front()-pre[a[i]]-1;            pre[a[i]]=q[a[i]].front();            q[a[i]].pop_front();            l[a[i]]++;        }        ans=max(l[a[i]],ans);        l[a[i]]--;    }    cout<<ans<<endl;    return 0;}


原创粉丝点击