zoukankan      html  css  js  c++  java
  • BZOJ2268 : Wormly

    考虑头部,一定是能向前就向前,因此是最左边的腿往右$b-1$个位置。

    头部移动之后,腿部就要相应地移动到区间内最靠右的$l$个$1$之上。

    若头部和腿部都不能移动,检查是否到达终点即可。

    用前缀和以及对前缀和做映射来支持查询。

    时间复杂度$O(n)$。

    #include<cstdio>
    const int N=1000010;
    int T,l,b,n,i,h,f,nh,nf,s[N],p[N];char a[N];long long ans;
    int main(){
      scanf("%d",&T);
      while(T--){
        scanf("%d%d%d%s",&l,&b,&n,a+1);
        for(i=1;i<=n;i++)if(a[i]=='0')s[i]=s[i-1];else p[s[i]=s[i-1]+1]=i;
        ans=n-b,h=b,f=l;
        while(1){
          nh=p[s[f]-l+1]+b-1;
          if(nh>n)nh=n;
          nf=p[s[nh]];
          if(nh==h&&nf==f)break;
          h=nh;
          if(nf>f)f=nf,ans+=l;
        }
        if(h<n)puts("IMPOSSIBLE");else printf("%lld
    ",ans);
      }
      return 0;
    }
    

      

  • 相关阅读:
    OWIN启动项的检测
    Katana概述
    update-database时出现Cannot attach the file
    数据并行
    SpinLock(自旋锁)
    屏障
    同步操作
    T4文本模板
    托管线程中的取消
    监视器
  • 原文地址:https://www.cnblogs.com/clrs97/p/7168182.html
Copyright © 2011-2022 走看看