C++の練習を兼ねて, AtCoder Beginner Contest 291 の 問題C (LRUD Instructions 2) ~ 問題D (Flip Cards) を解いてみた.
■感想.
1. 問題C, Dは, 方針を絞り込むことが出来たので, AC版に到達できたと思う.
2. 個人的には, 苦手な動的計画法 の訓練が積めたので, 非常に良かったと思う.
3. 引き続き, 時間を見つけて, 過去問の学習を進めていきたいと思う.
本家のサイト AtCoder Beginner Contest 291 解説 の 各リンク を ご覧下さい.
■C++版プログラム(問題C/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using P = pair<int, int>; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) #define a first #define b second int main(){ // 1. 入力情報. int N; char c[202020]; scanf("%d %s", &N, c); string s(c); // 2. 同じ座標にいたことがあるか? bool ok = false; set<P> st; P p = {0, 0}; st.insert(p); rep(i, N){ p.a += (s[i] == 'R'); p.a -= (s[i] == 'L'); p.b += (s[i] == 'U'); p.b -= (s[i] == 'D'); if(st.count(p)) ok = true; st.insert(p); } // 3. 出力. printf("%s\n", ok ? "Yes" : "No"); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[入力例] 5 RLURU [出力例] Yes ※AtCoderテストケースより [入力例] 20 URDDLLUUURRRDDDDLLLL [出力例] No ※AtCoderテストケースより [入力例] 55 RDDLLLUUUURRRRRDDDDDDLLLLLLLUUUUUUUURRRRRRRRRDDDDDDDDDD [出力例] No [入力例] 100 LDULUUUUURULUDULLRLDLLDURDRDDRDDDDURRRRRRUUDULRDDLDULULDULLDUDURLULLDDDRRLRRDDDURUDUDRLDLLDUUDULRLDL [出力例] Yes |
■C++版プログラム(問題D/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using LL = long long; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) const LL MOD = 998244353; int a[202020], b[202020]; LL dp[202020][2]; int main(){ // 1. 入力情報. int N; scanf("%d", &N); rep(i, N) scanf("%d %d", &a[i], &b[i]); // 2. dp更新. dp[0][0] = dp[0][1] = 1; rep(i, N - 1){ if(a[i] != a[i + 1]) dp[i + 1][0] += dp[i][0]; if(a[i] != b[i + 1]) dp[i + 1][1] += dp[i][0]; if(b[i] != a[i + 1]) dp[i + 1][0] += dp[i][1]; if(b[i] != b[i + 1]) dp[i + 1][1] += dp[i][1]; dp[i + 1][0] %= MOD; dp[i + 1][1] %= MOD; } // 3. 出力. printf("%lld\n", (dp[N - 1][0] + dp[N - 1][1]) % MOD); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
[入力例] 3 1 2 4 2 3 4 [出力例] 4 ※AtCoderテストケースより [入力例] 4 1 5 2 6 3 7 4 8 [出力例] 16 ※AtCoderテストケースより [入力例] 8 877914575 602436426 861648772 623690081 476190629 262703497 971407775 628894325 822804784 450968417 161735902 822804784 161735902 822804784 822804784 161735902 [出力例] 48 ※AtCoderテストケースより [入力例] 3 1 1 2 2 2 2 [出力例] 0 [入力例] 10 88 96 96 88 88 11 99 77 77 111 55 77 77 88 111 77 66 77 22 33 [出力例] 126 [入力例] 30 9999 11111 11111 10305 7777 11111 11111 7777 1750 888 888 205 888 12141 11771 888 9826 888 10702 9826 10702 10702 888 10702 6662 922 1246 250 888 250 6270 333 10393 613 7198 5555 5555 3333 11111 6666 10000 9137 2828 10000 3333 2905 6270 7777 250 6270 10000 3333 7777 10000 10000 250 7777 250 250 7777 [出力例] 907200 [入力例] 50 47659 8396 44206 66145 18843 74714 120877 56567 31519 93129 119310 103983 74529 54963 110863 109268 55344 39949 40669 7238 63635 63636 1104 113457 62546 4445 43212 105513 47795 19805 88550 24020 15554 38857 36169 87565 88907 38393 82788 107889 69552 43637 70541 13780 80576 100847 42088 31433 67767 21924 12908 64554 6376 15443 15520 70460 3698 97859 6971 3698 2958 51165 108163 113138 24818 28189 89658 90475 119113 7269 54028 5040 37553 19853 2192 104519 31460 110705 110705 111128 58218 25811 23122 68909 33085 71174 114681 74713 23519 59550 57478 76096 39447 57478 15712 100086 22588 39076 39076 87045 [出力例] 301633020 |
■参照サイト
AtCoder Beginner Contest 291(Sponsored by TOYOTA SYSTEMS)