C++の練習を兼ねて, AtCoder Beginner Contest 226 の 問題C (Martial artist) ~ 問題D (Teleportation) を解いてみた.
■感想.
1. 問題C, Dは, 方針を絞り込めたので, AC版に到達できたと思う.
2. 引き続き, 時間を見つけて, 過去問の学習を進めていきたいと思う.
本家のサイト AtCoder Beginner Contest 226 解説 の 各リンク を ご覧下さい.
■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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
// C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using LL = long long; using vi = vector<int>; using vvi = vector<vi>; #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 pb push_back int memo[202020]; LL t[202020]; int main(){ // 1. 入力情報. int N; scanf("%d", &N); vvi G(N); rep(i, N){ int k; scanf("%lld %d", &t[i], &k); rep(j, k){ int a; scanf("%d", &a); a--; G[i].pb(a); } } // 2. 技 N 習得に必要な 技 を探索. queue<int> q; memo[N - 1]++; for(auto &e : G[N - 1]) q.push(e), memo[e] = 1; while(!q.empty()){ int u = q.front(); q.pop(); for(auto &e : G[u]){ if(!memo[e]){ q.push(e); memo[e] = 1; } } } // 3. 必要な時間. LL ans = 0; rep(i, N) if(memo[i]) ans += t[i]; // 4. 出力. printf("%lld\n", ans); 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 |
[入力例] 3 3 0 5 1 1 7 1 1 [出力例] 10 ※AtCoderテストケースより [入力例] 5 1000000000 0 1000000000 0 1000000000 0 1000000000 0 1000000000 4 1 2 3 4 [出力例] 5000000000 ※AtCoderテストケースより [入力例] 7 5 0 7 1 1 1 2 1 2 6 2 2 3 5 1 1 9 3 1 2 4 3 2 4 5 [出力例] 27 [入力例] 20 10 0 20 1 1 75 1 1 59 2 1 3 10 2 1 2 1 2 1 2 118 4 1 2 4 5 3 1 1 95 2 5 6 1 2 8 9 88 1 10 31 2 5 7 68 3 2 4 6 22 2 10 11 76 3 1 3 5 82 5 1 5 8 13 14 89 5 2 3 8 11 13 122 1 1 5 8 1 2 4 5 9 10 11 13 29 5 1 5 10 11 16 [出力例] 563 |
■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 36 37 38 39 40 41 42 43 44 |
// C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using LL = long long; using P = pair<LL, LL>; using vi = vector<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--) LL x[505], y[505]; int main(){ // 1. 入力情報. int N; scanf("%d", &N); rep(i, N) scanf("%lld %lld", &x[i], &y[i]); // 2. 魔法を覚える. set<P> st; rep(i, N){ rep(j, N){ if(i != j){ // ベクトル(街i -> 街j). LL dx = x[j] - x[i]; LL dy = y[j] - y[i]; // 最大公約数で割る. LL g = __gcd(abs(dx), abs(dy)); dx /= g; dy /= g; // 保存. st.insert({dx, dy}); } } } // 3. 出力. printf("%d\n", st.size()); 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 |
[入力例] 3 1 2 3 6 7 4 [出力例] 6 ※AtCoderテストケースより [入力例] 3 1 2 2 2 4 2 [出力例] 2 ※AtCoderテストケースより [入力例] 4 0 0 0 1000000000 1000000000 0 1000000000 1000000000 [出力例] 8 ※AtCoderテストケースより [入力例] 12 11 9 6 3 4 5 5 2 6 5 11 3 10 8 3 2 2 12 2 2 11 5 8 7 [出力例] 84 [入力例] 20 15 4 1 12 2 13 10 3 24 17 23 15 17 21 7 12 16 17 3 14 22 14 5 13 3 12 4 15 21 13 17 3 5 16 20 12 6 8 19 11 [出力例] 208 |
■参照サイト
AtCoder Beginner Contest 226