Submission #171013

#TimeUsernameProblemLanguageResultExecution timeMemory
171013dantoh000Linear Garden (IOI08_linear_garden)C++14
100 / 100
294 ms17028 KiB
#include <bits/stdc++.h> using namespace std; int dp[2][5][5][5]; int l[1000005], r[1000005], m[1000005]; int n,mod; int a[1000005]; int main(){ scanf("%d%d",&n,&mod); l[0] = r[0] = m[0] = 2; for (int i = 1; i <= n; i++){ char x; scanf(" %c",&x); a[i] = (x=='L')?-1:1; m[i] = m[i-1] + a[i]; l[i] = min(l[i-1],m[i]); r[i] = max(r[i-1],m[i]); } int ans = 1; for (int i = n; i >= 0; i--){ if (i == n){ for (int L = 0; L <= 4; L++){ for (int R = 0; R <= 4; R++){ for (int M = 0; M <= 4; M++){ if (L <= M && M <= R && R - L <= 2) dp[n&1][L][R][M] = 1; } } } goto calc; } for (int L = 0; L <= 2; L++){ for (int R = 2; R <= 4; R++){ for (int M = 0; M <= 4; M++){ dp[i&1][L][R][M] = 0; if (L <= M && M <= R && R - L <= 2){ if (R-min(L,M-1) <= 2){ dp[i&1][L][R][M] += dp[1-i&1][min(L,M-1)][R][M-1]; dp[i&1][L][R][M] %= mod; } if (max(R,M+1)-L <= 2){ dp[i&1][L][R][M] += dp[1-i&1][L][max(R,M+1)][M+1]; dp[i&1][L][R][M] %= mod; } //printf("%d %d %d %d %d\n",i,L,R,M,dp[i&1][L][R][M]); } } } } calc:; if (a[i] == 1){ int nL = min(l[i-1],m[i-1]-1); int nM = m[i-1]-1; int nR = r[i-1]; if (nR-nL <= 2){ //printf("if takes -1 for %d, %d %d %d\n",i,nL,nR,nM); //printf("num ways dp(%d %d %d %d) = %d\n",i,nL,nR,nM,dp[i&1][nL][nR][nM]); ans += dp[i&1][nL][nR][nM]; ans %= mod; } } } printf("%d",ans); }

Compilation message (stderr)

linear_garden.cpp: In function 'int main()':
linear_garden.cpp:36:53: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
                             dp[i&1][L][R][M] += dp[1-i&1][min(L,M-1)][R][M-1];
                                                    ~^~
linear_garden.cpp:40:53: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
                             dp[i&1][L][R][M] += dp[1-i&1][L][max(R,M+1)][M+1];
                                                    ~^~
linear_garden.cpp:8:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&n,&mod);
     ~~~~~^~~~~~~~~~~~~~~~
linear_garden.cpp:12:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %c",&x);
         ~~~~~^~~~~~~~~~
#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...