2024-08-11

AtCoder Beginner Contest 365に参加した

競プロアルゴAtCoder

ABC365の参加記.

8月3日に開催されたトヨタ自動車プログラミングコンテスト2024#8(AtCoder Beginner Contest 365)に参加した.ABCDEの5完で509位.

A - Leap Year

問題文

西暦YY年の日数を答える問題.要するにうるう年かどうかが判定できればよく,うるう年の判定条件は問題文で与えられているので言われた通り実装する.

提出:https://atcoder.jp/contests/abc365/submissions/56238645

B - Second Best

問題文

長さNNの数列(Ai)(A_i)が与えられるので,AAの中で2番目に大きい要素のインデックスを求める問題.

Rustだとsorted_by_keyを使ってイテレータ0..nをソートするのが楽かも.

提出:https://atcoder.jp/contests/abc365/submissions/56238645

C - Transportation Expenses

問題文

整数N,MN, Mと数列(Ai)(A_i)が与えられるとき,

imin(x,Ai)M\sum_i \min(x, A_i)\leq M

を満たす最大の整数x(0)x(\geq 0)を求める問題.ストーリーは「1,,N1,\cdots, NNN人に交通費AiA_i円を支給するとき,予算MM円を超えないように1人あたりの支給上限額xxをどこまで大きくできるか?」というもの.

まず,上限額なしでも予算内に収まる場合(iAiM\sum_i A_i\leq Mのとき)は最大値が存在しない.そうでない場合は0xM0\leq x\leq Mの範囲に最大値が存在するので二分探索する.

二分探索パートは、判定関数f,探索範囲[ok, ng)(または(ng, ok])を渡すようなライブラリを事前に作っておくとバグりにくい.なお探索範囲の下限・上限ではなくtrue側の端点・false側の端点を渡すのはいわゆる「めぐる式」の実装である(出典).

提出:https://atcoder.jp/contests/abc365/submissions/56253079

D - AtCoder Janken 3

問題文

2人でじゃんけんをNN回する.相手が出す手が分かっているとき,直前と同じ手を出すことはできないという条件のもとで自分は最大何回勝つことができるか? という問題.

これは以下のような値を更新していくDPで解くことができる.

同じ手は連続して出せないので,(i,j)(i, j)から遷移できるのは(i+1,k)  (jk)(i + 1, k) \; (j\neq k)である.

実装上は,R, P, S0,1,20,1,2に対応させるなどすると勝利判定が少し楽になる.実際

なので面倒な場合分けが最小限で済む.

提出:https://atcoder.jp/contests/abc365/submissions/56260604

E - Xor Sigma Problem

問題文

長さNNの整数列(Ai)(A_i)が与えられるので,幅2以上のすべての区間に対する区間XORの総和

l+1<rAlAr1\sum_{l+1<r} A_l\oplus \cdots\oplus A_{r-1}

を求める問題.

定石に従い,桁ごとに考えて最後にそれぞれの項の和への寄与を足しあげることにする(dd桁目には係数として×2d\times 2^dがかかる).bitwise XORの定義から,AlAr1A_l\oplus \cdots\oplus A_{r-1}dd桁目というのはAl,,Ar1A_l, \cdots, A_{r-1}dd桁目に11が奇数個あれば11,偶数個あれば00になる.

よって,長さNNの01列の中で奇数個の11を含むような区間を数え上げればよく,これは累積和をmod  2{\rm mod} \;2で構築し値が異なるペアを数えればOK(01列x1,,xNx_1,\cdots, x_Nに対して,[l,r)[l, r)が奇数個の11を含む \Leftrightarrow累積和をsij[1,i)xjs_i\equiv \sum_{j\in [1, i)}x_jとしたときsrsls_r-s_lが奇数  sl≢sr(mod2)\Leftrightarrow\; s_l\not\equiv s_r\pmod 2).最後に幅1の区間を計算結果から除外することを忘れない.

提出:https://atcoder.jp/contests/abc365/submissions/56272194