Submission #249222

#TimeUsernameProblemLanguageResultExecution timeMemory
249222eohomegrownappsLinear Garden (IOI08_linear_garden)C++14
0 / 100
41 ms65540 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll m;

ll dpv[1000000][3][3];

ll dp(int len, int s, int e, int cur){
	//can we go up?
    //cout<<len<<" "<<s<<" "<<e<<" "<<cur<<'\n';
    if (!(s<=cur&&cur<=e)||(e-s>2)){
        return 0;
    }
    if (dpv[len][e-s][cur-s]!=-1){
        return dpv[len][e-s][cur-s];
    }
    if (len==0){
        return dpv[len][e-s][cur-s]=1;
    }
    if (e-s<2){
        return dpv[len][e-s][cur-s]=(dp(len-1,min(s,cur-1),e,cur-1)+dp(len-1,s,max(e,cur+1),cur+1))%m;
    } else {
        return dpv[len][e-s][cur-s]=((cur-1<s?0:dp(len-1,s,e,cur-1))+(cur+1>e?0:dp(len-1,s,e,cur+1)))%m;
    }
}

void initdp(){
    for (int i = 0; i<1000000; i++){
        for (int j = 0; j<3; j++){
            for (int k = 0; k<3; k++){
                dpv[i][j][k]=-1;
            }
        }
    }
}

int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    initdp();
    int n;
    cin>>n;
    cin>>m;
    int curmin = 0;
    int curmax = 0;
    int curval = 0;
    ll ind = 1;
    for (int i = 0; i<n; i++){
        char c;
        cin>>c;
        bool val = (c=='P');
        if (val){
            ind+=dp(n-i-1,min(curmin,curval-1),max(curmax,curval-1),curval-1);
            ind%=m;
            curval++;
        } else {
            curval--;
        }
        curmin=min(curmin,curval);
        curmax=max(curmax,curval);
    }
    cout<<ind<<'\n';
}
#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...