CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave(枚举+数学)

 

 

 

TLE code: 

const int N=2e6+5;

    int n,m;
    int i,j,k;
    int a[N];
    int vis[N];
    vector<int> v;

int idx(ll x)
{
    int ans=x/100000;
    if(x%100000) ans++;
    return ans;
}

int main()
{
    while(~sdd(n,m)){
        int opt,y;
        ll x,res;
        v.pb(0);
        for(int j=1;j<=n;j++){
            sd(opt); sll(x); sd(y);
            if(opt==1) x=idx(x);
            if(opt==1){
                int len=v.size();
                res=0;
                for(int i=1;i<=y;i++){
                    res+=x;
                    if(res>m) break;
                    for(int u=0;u<len;u++){
                        ll ans=v[u]+res;
                        if(ans>m) continue;
                        if(!vis[ans]) vis[ans]=j,v.pb(ans);
                    }
                }
            } else{
                int len=v.size();
                res=1;
                for(int i=1;i<=y;i++){
                    res*=x;
                    if(idx(res)>m) break;
                    for(int u=0;u<len;u++){
                        ll ans=idx(v[u]*res);
                        if(ans>m) continue;
                        if(!vis[ans]) vis[ans]=j,v.pb(ans);
                    }
                }
            }
        }
        for(int i=1;i<=m;i++){
            if(vis[i]) printf("%d ",vis[i]);
            else printf("-1 ");
        }
        puts("");
    }
    //PAUSE;
    return 0;
}

 ACcode:

const int N=2e6+5;

    int n,m;
    int i,j,k;
    //int a[N];
    int vis[N];
    vector<int> v(N,0);

ll idx(ll x)
{
    ll ans=x/100000;
    if(x%100000) ans++;
    return ans;
}

int main()
{
    while(~sdd(n,m)){
        int opt,y;
        ll x,res;
        v[0]=1;
        for(int j=1;j<=n;j++){
            sd(opt); sll(x); sd(y);
            if(opt==1) x=idx(x);
            vector<int> vv=v;
            if(opt==1){
                for(int i=0;i<=m;i++){
                    if(!v[i]) continue;
                    res=0;
                    for(int u=1;u<=y;u++){
                        res+=x;
                        if(res>m) break;
                        ll ans=res+i;
                        if(ans>m) break;
                        if(!v[ans]) vv[ans]=vis[ans]=j;
                        else break;
                    }
                }
            } else{
                for(int i=0;i<=m;i++){
                    if(!v[i]) continue;
                    res=i;
                    for(int u=1;u<=y;u++){
                        res=idx(res*x);
                        if(res>m) break;
                        if(!v[res]) vv[res]=vis[res]=j;
                        else break;
                    }
                }
            }
            v=vv;
        }
        for(int i=1;i<=m;i++){
            if(vis[i]) printf("%d ",vis[i]);
            else printf("-1 ");
        }
        puts("");
    }
    //PAUSE;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/115330060