• 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
  • 相关阅读:
    主键索引和非主键索引解析
    DNS劫持、污染的原理
    B-树,B+树与B*树的优缺点比较
    CollectionUtils工具类
    maven换源
    哪些字段可以加索引?
    callable和runnable的区别
    类加载器实例化时的顺序
    28BYJ-48步进电机
    《计算机网络》读书笔记之应用层
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7631996.html
Copyright © 2020-2023  润新知