競技プログラミングの鉄則 演習問題集(力試し問題) - noko206/AtCoder GitHub Wiki

競技プログラミングの鉄則 演習問題集(力試し問題)

これは何?

競技プログラミングの鉄則 演習問題集 の要点や感想をまとめたページです。

C01 - Tax Rate

$N+N/10$ が答え。

https://atcoder.jp/contests/tessoku-book/submissions/44559336

C02 - Two Balls

ボールの組み合わせを全探索。

https://atcoder.jp/contests/tessoku-book/submissions/44559382

C03 - Stock Queries

株価を前もって計算しておく。

https://atcoder.jp/contests/tessoku-book/submissions/44559504

C04 - Divisor Enumeration

約数列挙。 ライブラリをぺたり。

https://atcoder.jp/contests/tessoku-book/submissions/44559545

C05 - Lucky Numbers

47の2種類しか数字が使われないので2進数とみなすことができる。 0000000000を1番目のラッキー数とみなすため、 $N-1$ を2進数表記したときの04に、17に変換したものが $N$ 番目のラッキー数。

https://atcoder.jp/contests/tessoku-book/submissions/44559643

C06 - Regular Graph

$i$ → $i+1$ の頂点を順に結んだ円環状のグラフが答え。

https://atcoder.jp/contests/tessoku-book/submissions/44559773

C07 - ALGO-MARKET

累積和+二分探索。 まず、価格の小さい品物から貪欲に購入するのが最適。 $C_i$ をソートして累積和を取る。 累積和に対して $X_i$ 円で最大何個まで購入できるかを二分探索。

https://atcoder.jp/contests/tessoku-book/submissions/44560152

C08 - ALGO4

【★解説AC★】

かなり沼った。 解説PDFを読んで、解説のソースコードを読んで、ChatGPTに聞いて、 それでも解決しなかったので気合でなんとかした。

00009999を全探索するとき、 3等の条件と一致しないかどうかを判定するときに、 「1等であること」という条件を用いていたことがよくなかった。

正しくは、「1等であること」または「2等であること」。 条件式を変えたらACした。

WA https://atcoder.jp/contests/tessoku-book/submissions/44565501

AC https://atcoder.jp/contests/tessoku-book/submissions/44565568

C09 - Taro's Vacation

DPをする。

  • $dp[i][j]:=$ $i$ 日目に $j=0$ なら勉強していない、 $j=1$ なら勉強しているときの実力
  • $dp[i+1][0]=max(dp[i][1],dp[i][0])$
  • $dp[i+1][1]=dp[i][0]+a[i]$

https://atcoder.jp/contests/tessoku-book/submissions/44567207

C10 - A Long Grid

【★解説AC★】

$12×7^{W-1}$ が答え。 実験するとわかる。(わかりません)

ただ、確率は $N$ 手目で場合分け、組み合わせは $1$ 手目で場合分けが定石のはずなので、 漸化式を立てるときは気を付けていきたい。

https://atcoder.jp/contests/tessoku-book/submissions/44567929

C11 - Election

【★解説AC★】

全体のボーダーで二分探索をすればよかった。 各党に対して二分探索してたら間に合わないのでは?というか無理では?になってた。 制約から二分探索であることはなんとなくわかっていたのだから、 難しく考えずに二分探索しやすい値に着目すべきだった。

double型の二分探索は100回くらいループを回せばよい。

https://atcoder.jp/contests/tessoku-book/submissions/44575206

C12 - Taro the Novel Writer

【★解説AC★】

DPであるというところまで解説を読んだ。(最初グラフの問題だと思ってた。)

  • $dp[i][j]:=$ $i$ 章が $j$ ページ目で終わるときの繋がりの最大値
  • $chmax(dp[i+1][r+1], dp[i][l] + cnt[l][r])$
    • ただし、 $cnt[l][r]$ は $l$ ページ目から $r$ ページ目までを一つの章としたときの繋がりの個数
  • $i$ 章を $l$ ページ目から $r$ ページ目までとするような3重ループを回してDP配列を更新する

https://atcoder.jp/contests/tessoku-book/submissions/44643260

C13 - Select 2

$P=0$ かどうかで場合分け。

  • $P=0$ の場合
    • $A_i=0$ なら、答えに $i$ を加算。(0-indexed)
    • $A_i \ne 0$ なら、これまでに現れた $A_i=0$ の個数を答えに加算
  • $P \ne 0$ の場合
    • 以下のように式変形をする
    • $A_iA_j%M=P$ ( $M$ は1000000007 )
    • $A_iA_j=Mk+P$ ( $k$ は整数 )
    • $A_j=A_i^{-1}Mk+A_j^{-1}P$
    • $A_j≡A_i^{-1}P$ ( mod $M$ )
    • よって、mapでこれまでに現れたら $A_j$ の個数をカウントして、 $A_i^{-1}P$ と一致するものの個数を答えに加算すればよい

https://atcoder.jp/contests/tessoku-book/submissions/44577112

C14 - Commute Route

始点からのダイクストラと、終点からのダイクストラをそれぞれ行う。

頂点 $i$ が最短経路に含まれるかどうかは、 始点から頂点 $i$ までの最短距離と、終点から頂点 $i$ までの最短距離の合計が 始点から終点までの最短距離と一致しているとき。

https://atcoder.jp/contests/tessoku-book/submissions/44577502

C15 - Many Meetings

【★解説AC★】

左から区間スケジューリングした結果と、右から区間スケジューリングした結果を前処理しておく。 各会議 $i$ について、以下が答え。 $L_i$ までに会議が終了しているときの最大 + 1(会議 $i$ の分)+ $R_i$ 以降に始まる会議の最大

https://atcoder.jp/contests/tessoku-book/submissions/44644258

C16 - Flights

【★解説AC★】

重実装すぎた問題。 始点、各空港の頂点、フライト前と後の頂点、各空港の頂点、終点を用意して、 $1+N+2M+N+1$ 頂点のグラフを作成してDPをする。

DP値は時刻の昇順に更新していく。 そのため、フライト前と後の頂点は時刻の昇順に頂点番号をつけておくと、 頂点番号順にDP値を更新していけばいいので実装が楽になる。 というより、BFSやトポソ順だとうまくいかなかったので、その順番にする必要がある。

https://atcoder.jp/contests/tessoku-book/submissions/44705683

C17 - Strange Data Structure?

【★解説AC★】

Dequeを2つ使用する。 列の真ん中から分けて、前半分と後ろ半分をそれぞれ管理する。

データ構造系の問題は $2$ つ(以上)組み合わせてうまくいかないかを考えるとよさそう。

https://atcoder.jp/contests/tessoku-book/submissions/44663753

C18 - Pick Two(★6)

区間DPをする。

  • $dp[l][r]:=$ 区間 $[l, r]$ でかかるコストの総和の最小値
  • $chmin(dp[l][r], dp[l][i] + dp[i + 1][r])$ $(l + 1 \le i \le r - 2, i$ は $2$ ずつ進める $)$
    • 左右で分割して遷移
  • $chmin(dp[l][r], abs(a[l] - a[r]) + dp[l + 1][r - 1])$
    • 両端と真ん中で分割して遷移

https://atcoder.jp/contests/tessoku-book/submissions/44664395

C19 - Gasoline Optimization Problem

【★解説AC★】

セグ木を使う。 ふわっとした理解しかしていない。

まず、給油するガソリンの総量は $L-K$ リットル。 $i$ リットル目のガソリンを得るための最小価格は、 区間 $[i+1, i+k]$ にあるガソリンスタンドの最小価格になるので、 これをセグ木で高速に求める。

https://atcoder.jp/contests/tessoku-book/submissions/44696195

C20 - Mayor's Challenge

ヒューリスティックなので飛ばします><