Cookie Choice II ZOJ

来源:互联网 发布:斗鱼主播都用什么软件 编辑:程序博客网 时间:2024/06/05 18:01

**【题目大意】

就是找一个最短连续子序列,使得对于每个i,min[i]<=sum(i)<=max[i]**

这题还有别的写法;这只是别人的一种
注意这个判断合不合法不要又重复判断。。。
一开始逗比了,还打算重复判断那样坑定会超时。。
用个头尾指针更清晰
这里的p就是头指针,i是尾指针。。

int a[N],L[N],R[N];int cnt[N];void solve(){    int p=1;    int ans=-1;    for(int i=1;i<=n;++i){        int x=a[i];        cnt[x]++;        if(cnt[x]==L[x])legal++;        if(cnt[x]==R[x]+1){            for(int j=p;;++j){                cnt[a[j]]--;                if(cnt[a[j]]==L[a[j]]-1)legal--;                if(a[j]==x){                    p=j+1;break;                }            }        }        for(int j=p;;j++){            if(cnt[a[j]]>L[a[j]])cnt[a[j]]--;            else{                p=j;break;            }        }        if(legal==k){            int len=i-p+1;            if(ans<0||ans>len)ans=len;        }    }    pf("%d\n",ans);}int main(){    while(~sf("%d%d",&n,&k)){        legal=0;        rep(i,1,n)sf("%d",&a[i]);        rep(i,1,k){ sf("%d%d",&L[i],&R[i]);if(L[i]<=0&&R[i]>=0)legal++; }        solve();    }}
原创粉丝点击