Submission #525849

#TimeUsernameProblemLanguageResultExecution timeMemory
525849DeepessonLinear Garden (IOI08_linear_garden)C++17
100 / 100
545 ms1384 KiB
#include <bits/stdc++.h>

int N,M;
#define MAX 1100000
int tab[2][33][5][2];
int base=2;
std::string s;
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    std::cin>>N>>M>>s;
    {
        for(int j=0;j!=33;++j){
            for(int k=-2;k!=3;++k){
                for(int u=0;u!=5;++u){
                    if(j&(1<<u)){
                        int _ = u-2;
                        int __ = k-_;
                        if(__>2||__<-2) goto next;
                    }

                }
                for(int v=0;v!=2;++v){
                    tab[N%2][j][k+2][v]=1;
                    prox:{}
                }
                next:{}
            }
        }
    }
    for(int i=N-1;i!=-1;--i){
        for(int j=0;j!=33;++j){
            if(!(j&(1<<2)))goto invalido;{
            int nivel = 0;
            for(int u=0;u!=5;++u){
                if(j&(1<<u)){
                    if(!nivel)nivel=1;
                    else if(nivel==2)goto invalido;
                }else {
                    if(nivel==1)nivel=2;
                }
            }
            for(int k=-2;k!=3;++k){
               if(!(j&(1<<(k+2))))continue;
                bool marc=false;
                for(int u=0;u!=5;++u){
                    if(j&(1<<u)){
                        int _ = u-2;
                        int __ = k-_;
                        if(__>2||__<-2) {marc=true;goto aq;}
                    }
                }
                aq:
                for(int v=0;v!=2;++v){
                    if(marc){tab[i%2][j][k+2][v]=0;continue;}
                    int pente=j;
                    int pos=i;
                    int atual,soma;
                    atual=soma=k;
                    int desceu=v;
                    if(v){
                        int alpha=0,beta=0;
                        if(atual<2){
                            alpha=tab[(pos+1)%2][pente|(1<<(soma+3))][soma+3][1];
                        }

                        if(atual>-2){
                            beta=tab[(pos+1)%2][pente|(1<<(soma+1))][soma+1][1];
                        }

                        tab[pos%2][pente][soma+2][desceu] = ( alpha + beta ) % M;
                    }else {
                    if(s[pos]=='L'){

                        if(atual>-2){///Aperta L
                            tab[pos%2][pente][soma+2][desceu] = tab[(pos+1)%2][pente|(1<<(soma+1))][soma+1][0];
                        }else tab[pos%2][pente][soma+2][desceu]=0;

                    }else {

                        int alpha=0,beta=0;

                        if(atual<2){///Aperta P
                            alpha=tab[(pos+1)%2][pente|(1<<(soma+3))][soma+3][0];
                        }

                        if(atual>-2){///Aperta L
                            beta=tab[(pos+1)%2][pente|(1<<(soma+1))][soma+1][1];
                        }

                        tab[pos%2][pente][soma+2][desceu] = ( alpha + beta ) % M;

                    }
                }
                    ///Invalido
                    proxa:{}
                }
            }
            continue;}
            invalido:{}
        }
    }
    std::cout<<tab[0][(1<<2)][2][0]<<"\n";
}

Compilation message (stderr)

linear_garden.cpp: In function 'int main()':
linear_garden.cpp:35:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   35 |             if(!(j&(1<<2)))goto invalido;{
      |             ^~
linear_garden.cpp:35:42: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   35 |             if(!(j&(1<<2)))goto invalido;{
      |                                          ^
linear_garden.cpp:27:21: warning: label 'prox' defined but not used [-Wunused-label]
   27 |                     prox:{}
      |                     ^~~~
linear_garden.cpp:98:21: warning: label 'proxa' defined but not used [-Wunused-label]
   98 |                     proxa:{}
      |                     ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...