Submission #98627

#TimeUsernameProblemLanguageResultExecution timeMemory
98627PeppaPigLinear Garden (IOI08_linear_garden)C++14
100 / 100
351 ms14080 KiB
#include <bits/stdc++.h>

#define long long long

using namespace std;

const int N = 1e6+5;

int n, m, mx[N], mn[N], cur[N];
long dp[2][3][3][5], ans = 1;
char A[N];

int main() {
    scanf("%d %d", &n, &m);
    scanf(" %s", A+1);
    for(int i = 1; i <= n; i++) {
        mx[i] = mx[i - 1], mn[i] = mn[i - 1], cur[i] = cur[i - 1];
        if(A[i] == 'L') ++cur[i];
        else --cur[i];
        mx[i] = max(mx[i], cur[i]), mn[i] = min(mn[i], cur[i]);
    }
    for(int i = n; i; i--) {
        int now = i & 1, pre = now ^ 1;
        for(int a = 0; a <= 2; a++) for(int b = -2; b <= 0; b++) for(int x = -2; x <= 2; x++) {
            dp[now][a][2 + b][2 + x] = 0;
            if(a - b > 2 || x < b || x > a) continue;
            if(i == n) dp[now][a][2+b][2+x] = 1;
            else {
                if(x < 2 && max(a, x + 1) - b <= 2) dp[now][a][2 + b][2 + x] += dp[pre][max(a, x + 1)][2 + b][3 + x];
                if(x > -2 && a - min(b, x - 1) <= 2) dp[now][a][2 + b][2 + x] += dp[pre][a][2 + min(b, x - 1)][1 + x];
                dp[now][a][2 + b][2 + x] %= m;
            }
        }
        if(A[i] == 'P') {
            int x = cur[i - 1] + 1, a = max(mx[i - 1], x), b = min(mn[i - 1], x);
            if(x <= 2 && a - b <= 2) {
                if(i == n) ++ans;
                else ans += dp[now][a][2 + b][2 + x];
                ans %= m;
            }
        }
    } 
    printf("%lld\n", ans);

    return 0;
}

Compilation message (stderr)

linear_garden.cpp: In function 'int main()':
linear_garden.cpp:14:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &n, &m);
     ~~~~~^~~~~~~~~~~~~~~~~
linear_garden.cpp:15:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf(" %s", A+1);
     ~~~~~^~~~~~~~~~~~
#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...