首页 > 代码库 > zoj-3790-Consecutive Blocks
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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。