Bondo416さんのトヨタ自動車プログラミングコンテスト2023#8(AtCoder Beginner Contest 333)での成績:780位
— ボンド@競プロ (@bond_cmprog) December 16, 2023
パフォーマンス:1669相当
レーティング:1502→1520 (+18) :)#AtCoder #トヨタ自動車プログラミングコンテスト2023#8(ABC333) https://t.co/oTEv74XcuH
A - Three Threes
$ N $ 回 $ N $ を出力する
void solve() { int N; cin >> N; REP(i, N) cout << N; cout << endl; }
B - Pentagon
五角形の頂点を何回移動してたどり着けるかを数え一致していれば Yes
void solve() { string S, T; cin >> S >> T; string U = "ABCDEABCDE"; int s = 10, t = 10; REP(i, 10) REP(j, 10) { if (S[0] == U[i] and S[1] == U[j]) chmin(s, abs(j - i)); if (T[0] == U[i] and T[1] == U[j]) chmin(t, abs(j - i)); } cout << (s == t ? "Yes" : "No") << endl; }
C - Repunit Trio
解の最大値が $ 112222222233 $ であるので12桁までのレピュニットを作り、$ 12 ^ 3 $ 通りの候補を作成、重複を削除してソートをしたものの $ N $ 番目のものが答え
void solve() { int N; cin >> N; vector<ll> repu; REP(l, 13) { ll i = 1; REP(_, l) i = i * 10 + 1; repu.push_back(i); } vector<ll> cand; for (ll num1 : repu) { for (ll num2 : repu) { for (ll num3 : repu) { cand.push_back(num1 + num2 + num3); } } } sort(ALL(cand)); cand.erase(unique(ALL(cand)), cand.end()); cout << cand[N - 1] << endl; }
D - Erase Leaves
頂点 $ 1 $ を削除するためには頂点 $ 1 $ の子が $ 1 $ つである必要がある
そのため子の部分木のサイズが最大のものを残し、それ以外を削除する操作をするのが最適となる
void solve() { int N; cin >> N; vector<vector<int>> g(N); REP(i, N - 1) { int u, v; cin >> u >> v; --u, --v; g[u].emplace_back(v); g[v].emplace_back(u); } vector<int> sz(N); auto dfs = [&](auto &&self, int v, int par) -> int { sz[v] = 1; for (auto &e : g[v]) { if (e == par) continue; sz[v] += self(self, e, v); } return sz[v]; }; dfs(dfs, 0, -1); int ans = INF; int sum = 0; for (auto nv : g[0]) { sum += sz[nv]; } for (auto nv : g[0]) { chmin(ans, sum - sz[nv] + 1); } cout << ans << endl; }
E - Takahashi Quest
クエリを逆から考えるとクエリ $ 2 $ のときポーションを獲得し、クエリ $ 1 $ のときにそのポーションを持っていれば消費すると考えれば良い
上記をシミュレーションし、持っているポーションの最大値とポーションを獲得するかどうかを求めれば良い
void solve() { int N; cin >> N; vector<int> need(202020); vector<int> t(N), x(N); int ma = 0; int sum = 0; REP(i, N) cin >> t[i] >> x[i]; vector<int> ans; for (int i = N - 1; i >= 0; i--) { if (t[i] == 1) { if (need[x[i]]) { need[x[i]]--; sum--; ans.emplace_back(1); } else ans.emplace_back(0); } else { need[x[i]]++; sum++; chmax(ma, sum); } } REP(i, 202020) if (need[i] > 0) { cout << -1 << endl; return; } cout << ma << endl; reverse(ALL(ans)); for (auto x : ans) cout << x << " "; cout << endl; }