競技プログラミングの鉄則 演習問題集(力試し問題) - 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
4
と7
の2種類しか数字が使われないので2進数とみなすことができる。
0000000000
を1番目のラッキー数とみなすため、
$N-1$ を2進数表記したときの0
を4
に、1
を7
に変換したものが $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に聞いて、 それでも解決しなかったので気合でなんとかした。
0000
~9999
を全探索するとき、
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
ヒューリスティックなので飛ばします><