답안 #890650

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
890650 2023-12-21T17:58:32 Z Macker Linear Garden (IOI08_linear_garden) C++17
100 / 100
346 ms 3432 KB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define all(v) v.begin(), v.end()

ll dp[3][3][5]; //mx, mn, cur
ll ldp[3][3][5]; //mx, mn, cur
ll m;

int main()
{
    int n; cin >> n; cin >> m;
    string s; cin >> s;
    memset(dp, 0, 3*3*5*sizeof(ll));
    memset(ldp, 0, 3*3*5*sizeof(ll));
    int cmx, cmn, ccur;
    if(s[0] == 'P'){
        dp[1][0][3] = 1;
        cmx = 1, cmn = 0, ccur = 3;
    }
    else{
        cmx = 0, cmn = 1, ccur = 1;
    }
    dp[0][1][1] = 1;
    for (int i = 0; i < n - 1; i++)
    {
        swap(dp, ldp);
        memset(dp, 0, 3*3*5*sizeof(ll));
        bool st[3][3][5];
        memset(st, 0, 3*3*5);
        for (int mx = 0; mx < 3; mx++)
        for (int mn = 0; mn < 3; mn++)
        for (int cur = 0; cur < 5; cur++) {
            for (ll a = -1; a < 2; a += 2) {
                int acur = cur - 2 + a;
                int amx = max(mx, acur);
                int amn = min(-mn, acur);
                if(amx > 2 || amn < -2 || amx - acur > 2 || acur - amn > 2) continue;
                dp[amx][-amn][acur + 2] += max(ldp[mx][mn][cur], 0LL);
                dp[amx][-amn][acur + 2] %= m;
                st[amx][-amn][acur + 2] = 1;
            }
        }
        if(ccur + 1 < 5 && s[i + 1] == 'L'){
            int x = max(cmx, ccur - 2 + 1);
            if(st[x][cmn][ccur + 1]){
                dp[x][cmn][ccur + 1]--;
                dp[x][cmn][ccur + 1] += m;
                dp[x][cmn][ccur + 1] %= m;
            }
        }
        if(s[i + 1] == 'P') ccur++;
        else ccur--;
        cmx = max(ccur - 2, cmx);
        cmn = max(-(ccur - 2), cmn);
    }
    ll res = 0;
    for (int mx = 0; mx < 3; mx++)
    for (int mn = 0; mn < 3; mn++)
    for (int cur = 0; cur < 5; cur++){
        res += dp[mx][mn][cur];
        res %= m;
    }
    cout << res << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 436 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 348 KB Output is correct
2 Correct 2 ms 348 KB Output is correct
3 Correct 2 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 508 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 452 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 111 ms 1368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 134 ms 1432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 171 ms 2040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 209 ms 2136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 346 ms 3344 KB Output is correct
2 Correct 321 ms 3348 KB Output is correct
3 Correct 325 ms 3432 KB Output is correct