1. 程式人生 > >Codeforces Round #345 (Div. 1)B. Image Preview

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

scanf push spa hid splay while sizeof can lld

題意:給一堆照片,只能左右翻(時間為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