제출 #249233

#제출 시각아이디문제언어결과실행 시간메모리
249233eohomegrownappsLinear Garden (IOI08_linear_garden)C++14
100 / 100
146 ms54136 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int m;

int dpv[1000000][3];

int 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 (e-s==2&&len%2==0&&dpv[len/2][cur-s]!=-1){
        return dpv[len/2][cur-s];
    }
    if (len==0){
        return 1;
    }
    if (e-s<2){
        return (dp(len-1,min(s,cur-1),e,cur-1)+dp(len-1,s,max(e,cur+1),cur+1))%m;
    } else {
        if (len%2==0){
            return dpv[len/2][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;
        } else {
            return ((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<500000; i++){
        //for (int j = 0; j<3; j++){
            for (int k = 0; k<3; k++){
                dpv[i][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...