Codeforces Round #345 (Div. 1)B. Image Preview

Posted walfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",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\n",t,m,i,alltime(m,i));
         //   printf("%d %d %d %lld\n",l,m,r,alltime(m,i));
            if(alltime(m,i)>te)r=m;
            else l=m;
        }
       // printf("%lld %d %d\n",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\n",t,m,i,alltime(m,i));
         //   printf("%d %d %d %lld\n",l,m,r,alltime(m,i));
            if(alltime(m,i)>te)r=m;
            else l=m;
        }
       // printf("%lld %d %d\n",t,l,i);
        ans=max(ans,(ll)max((l+1),i));
    }
    printf("%lld\n",ans);
    return 0;
}
/********************
5 2 4 13
hhhwh
********************/
View Code

 

以上是关于Codeforces Round #345 (Div. 1)B. Image Preview的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #345 (Div. 2)

Codeforces Round #345 (Div. 2)

A Joysticks (Codeforces Round 345 (Div 2) )

Codeforces Round #345 (Div. 2)C. Watchmen(想法题)

Codeforces Round #345 (Div. 1)B. Image Preview

Codeforces Round #345 Div.1 D.Zip-line 动态最长上升子序列