zoukankan      html  css  js  c++  java
  • Codeforces Round #345 (Div. 1)B. Image Preview

    题意:给一堆照片,只能左右翻(时间为a),如果看的时候不正,就旋转(时间为b),看的时间为1,不能跳过,看过的不用再看,求看到的最大照片数

    题解:模拟+二分,先从左到右扫一遍,扫的同时反向进行二分,看最远能到达的地方是哪里,然后求看到的最大照片数,还要反向来一遍,先向后扫,然后向前二分

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 2147493647
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=500000+10,maxn=60000+10,inf=0x3f3f3f3f;
    
    char s[N];
    int suf[N],n;
    ll a,b,t;
    ll alltime(int x,int i)
    {
        if(x<i)return a*(i-x-1);
        else if(x>=i)return b*suf[n-x+i]+a*(x-1)+x-i+1;
    }
    int main()
    {
        ll ans=0;
        scanf("%lld%lld%lld%lld%s",&n,&a,&b,&t,s+1);
        for(int i=n;i>=1;i--)
        {
            if(s[i]=='w')suf[i]=suf[i+1]+1;
            else suf[i]=suf[i+1];
        }
      //  printf("%lld
    ",alltime(1,1));
      //  for(int i=1;i<=n;i++)printf("%d ",suf[i]);
        ll te=t;
        for(int i=1;i<=n;i++)
        {
            if(s[i]=='w')te-=1+b;
            else te-=1;
            if(te<0)break;
            te-=a;
            int l=0,r=n;
            while(l<r-1)
            {
                int m=(l+r)/2;
                //printf("%lld %d %d %lld
    ",t,m,i,alltime(m,i));
             //   printf("%d %d %d %lld
    ",l,m,r,alltime(m,i));
                if(alltime(m,i)>te)r=m;
                else l=m;
            }
           // printf("%lld %d %d
    ",t,l,i);
            ans=max(ans,(ll)max((l+1),i));
        }
        for(int i=2;i<=(n+2)/2;i++)
            swap(s[i],s[n-i+2]);
        memset(suf,0,sizeof suf);
        for(int i=n;i>=1;i--)
        {
            if(s[i]=='w')suf[i]=suf[i+1]+1;
            else suf[i]=suf[i+1];
        }
        te=t;
        for(int i=1;i<=n;i++)
        {
            if(s[i]=='w')te-=1+b;
            else te-=1;
            if(te<0)break;
            te-=a;
            int l=0,r=n;
            while(l<r-1)
            {
                int m=(l+r)/2;
                //printf("%lld %d %d %lld
    ",t,m,i,alltime(m,i));
             //   printf("%d %d %d %lld
    ",l,m,r,alltime(m,i));
                if(alltime(m,i)>te)r=m;
                else l=m;
            }
           // printf("%lld %d %d
    ",t,l,i);
            ans=max(ans,(ll)max((l+1),i));
        }
        printf("%lld
    ",ans);
        return 0;
    }
    /********************
    5 2 4 13
    hhhwh
    ********************/
    View Code
  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7631996.html
Copyright © 2011-2022 走看看