• zoj-3790-Consecutive Blocks


    使用l,r指针游动。

    然后使用记录游动过程中的最大值。

    我离散化了一下。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    #include<vector>
    #include<map>
    using namespace std;
    #define maxn 110000
    map<int,int>mp;
    struct list
    {
        int x;
        int get;
        int lose;
        int leap;
    }node[maxn];
    struct pian
    {
        int ll;
        int now;
        int use;
        int all;
    }ps[maxn];
    int a[maxn];
    int b[maxn];
    int pre[maxn];
    int st[maxn];
    int last[maxn];
    int main()
    {
        int n,k;
        while(~scanf("%d%d",&n,&k))
        {
            mp.clear();
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                b[i]=a[i];
            }
            sort(b+1,b+n+1);
            int qq=1;
            b[0]=0;
            b[n+1]=0;
            for(int i=1;i<=n;i++)
            {
                if(b[i]!=b[i-1])
                {
                    mp[b[i]]=qq;
                    b[qq]=b[i];
                    qq++;
                }
            }
            for(int i=1;i<=n;i++)a[i]=mp[a[i]];
            memset(node,0,sizeof(node));
            memset(ps,0,sizeof(ps));
            memset(pre,0,sizeof(pre));
            memset(st,0,sizeof(st));
            memset(last,0,sizeof(last));
            st[a[1]]=1;
            a[n+1]=0;
            for(int i=2;i<=n+1;i++)
            {
                if(a[i]!=a[i-1])
                {
                    int x=a[i-1];
                    node[i-1].x=x;
                    if(last[x]==0)node[i-1].lose=0;
                    else node[i-1].lose=st[x]-last[x]-1;
                    node[i-1].get=i-st[x];
                    node[i-1].leap=1;
                    st[a[i]]=i;
                    pre[last[x]]=i-1;
                    last[x]=i-1;
                }
            }
            /*
            for(int i=1;i<=n;i++)
            {
                printf("%d ",node[i].lose);
            }
            cout<<endl;
            for(int i=1;i<=n;i++)
            {
                printf("%d ",node[i].get);
            }
            cout<<endl;
            for(int i=1;i<=n;i++)
            {
                printf("%d ",pre[i]);
            }
            cout<<endl;*/
            int ans=-1;
            for(int i=1;i<=n;i++)
            {
                if(node[i].leap)
                {
                    int x=node[i].x;
                    if(x==0)continue;
                    int add=node[i].get;
                    int sub=node[i].lose;
                    ps[x].use+=sub;
                    ps[x].now+=add;
                    if(ps[x].ll==0)
                    {
                        ps[x].ll=i;
                        ps[x].all=max(ps[x].all,ps[x].now);
                        ans=max(ans,ps[x].all);
                       // cout<<i<<"-"<<ps[a[i]].now<<" "<<ps[a[i]].use<<endl;
                        continue;
                    }
                    int y=ps[x].ll;
                    while(ps[x].use>k)
                    {
                        ps[x].now-=node[y].get;
                        y=pre[y];
                        ps[x].use-=node[y].lose;
                    }
                    ps[x].ll=y;
                    ps[x].all=max(ps[x].all,ps[x].now);
                    ans=max(ans,ps[x].all);
                }
               // cout<<i<<" "<<ps[a[i]].now<<" "<<ps[a[i]].use<<endl;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    
    
    
    


  • 相关阅读:
    疫情数据背后,聊聊数据分析平台变迁史
    华为五大专家亲述:如何转型搞 AI?
    【华为云技术分享】LwM2M协议的学习与分享
    Spring5参考指南: BeanWrapper和PropertyEditor
    Spring5参考指南: Resources
    Spring5参考指南:事件Event
    Spring5参考指南:Environment
    Spring5参考指南:JSR 330标准注解
    Spring5参考指南:组件扫描
    Spring5参考指南:基于注解的容器配置
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10630148.html
Copyright © 2020-2023  润新知