4377: [POI2015]Kurs szybkiego czytania

取補比取交要簡單….思考問題的另一面;

#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=n;i++)
using namespace std;
const int N=1e6+7;
char s[N];
int n,a,b,p,m,len,tot=0;
void upd(int& x,int y){x+=y;if(x>=n)x-=n;while(x<0)x+=n;}
struct E{
    int x,y;E(int x=0,int y=0):x(x),y(y){}
}c[N<<2];
bool cmp(const E& A,const E& B){return A.x<B.x;}
int main(){
    scanf("%d%d%d%d%d",&n,&a,&b,&p,&m);
    scanf("%s",s);len=strlen(s);
    int k=0,up,dw,ans=0,r=0;
    rep(i,0,len-1){
        if(s[i]=='1')dw=-k,up=p-k-1;
        else dw=p-k,up=n-k-1;
        upd(dw,0),upd(up,0);

        if(dw<=up)c[++tot]=E(dw,up);
        else {c[++tot]=E(dw,n-1);c[++tot]=E(0,up);}

        upd(k,a);
    }k=1ll*(n-m+1)*a%n;
    rep(i,n-m+2,n){int res=k;upd(res,b);c[++tot]=E(res,res);upd(k,a);}
    sort(c+1,c+tot+1,cmp);
    rep(i,1,tot){
        if(c[i].x>r)
            ans+=c[i].x-r;
        r=max(r,c[i].y+1);
    }
    printf("%d\n",ans+n-r);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章