zoj-3790-Consecutive Blocks

来源:互联网 发布:韦东山嵌入式linux项目 编辑:程序博客网 时间:2024/05/20 03:40

使用l,r指针游动。

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

我离散化了一下。

#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<vector>#include<map>using namespace std;#define maxn 110000map<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;}


0 0
原创粉丝点击