ACL Beginner Contest 感想

ううううううううううしたぷにきあくん笑笑笑笑笑笑笑笑笑

 

ACL Beginner Contestに参加して図1のような成績だった 5完いたのは良い。5ペナはカス レートは上がったのでヨシ!

f:id:knzk398:20200927002154p:plain

図1

コンテスト中に解くことが出来たAからEまでの感想を吐く。

 

A. Repeat ACL

yarudake rep(i,k)cout<<"ACL";

https://atcoder.jp/contests/abl/submissions/17049246

 

B. Integer Preference

難しすぎる 適当を書いて2ペナ(は?)1ペナした時点で次は絶対ACできる提出をしろや

区間(A,B)と(C,D)が重なっているか判定する。二つの区間が重なっている場合は4通りしかないので全部試す

https://atcoder.jp/contests/abl/submissions/17049284

 

C. Conner Cities

union find (disjoint set)で与えられたグラフを構築します。互いに行き来することが出来る頂点をまとめて一つの頂点としてみた時に残っている頂点の個数を N' とするとそれらの頂点を連結にするために必要な辺の数は N'-1 になる。いや直感でわかるので説明するのが難しいです

https://atcoder.jp/contests/abl/submissions/17049380

 

D. Flat Subsequence

い つ も の

お ま た せ

親 の 顔 よ り 見 た セ グ 木 D P

dp[i][j] = i 番目までみてBに値 j を選択するときの最大の長さとしてDPをする。よくみると時系列の i は不要だとわかるのでdp[j] = B に値 j を選択するときの最大の長さとする。遷移は値 j との差の絶対値が k 以下のところから遷移してくることができるので  dp[ a_i ] = max(dp[a_i-k],dp[a_i-k+1],...,dp[a_i+k-1],dp[a_i+k])+1 と表せる。これを愚直にやるとO(N^2)なので区間 max をセグ木で高速化する.

コンテスト中に雑に書いて1ペナをもらってしまったので反省した。

fold(l,r)をするときにlが0未満だったりrがn以上のときの処理を毎回main関数内で書いてバグらせるのはアホなのでセグ木のほうでそういうのをいい感じに丸めるようにした。これもバグの原因になりそうで怖いけど

https://atcoder.jp/contests/abl/submissions/17049596

 

E. Replace Digits

むずかしーーーーーーーーーーーーー

ほんまか?割とすぐに見えて、実装するのに手間取った。

自分にしては珍しくコメントを書いた(コメントは書いてない)のでコードを見て理解してほしい

https://atcoder.jp/contests/abl/submissions/17065133

 値とその値の桁数(区間の長さ)を遅延セグ木に乗せます。1と1をマージするときは結果として11が欲しいので1*10+1をします。22と66をマージするときは22*100+66をします。この*10とか*100はmerge(a,b)をするときに10の(bの桁数)乗で計算できます。

区間更新をするときはupdate({value,size},d)として{ddd...ddd,size}を返します。例を挙げると、update({3344,4},7)では{7777,4}を返します。この数dがsize個連なった値は前計算で求めておきます。

 

おつかれ