jj1gujのブログ

アイコン画像は音速の奇行子 様よりいただきました

ABC157参加

ABC157に参加しました.
結果はこちら
Fortranで1完, C++で1完, Python3で1完でした.

A問題

Fortranで出しました.
 \lceil N/2 \rceilを出力して終わりでした.

B問題

C++で出しました. とりあえずゴリゴリ実装しました.
ビンゴで穴が開いた箇所を1とし, 穴が開いていない箇所を0とした配列を用意し, 縦・横・斜めの和をとって3になる箇所があるときにYesと出力するようにしました.
最初, Fortranで実装したのですが何故か動かなあったのでC++で実装し直しました.

C問題

Python3で出しました.
出力する数の各桁の数を要素とした配列を用意しました.
その後, 入力に従って配列の要素を操作しました.


D問題, E問題はデータ構造の知識問題っぽいところがあったっぽいですね…
もっと精進しておくべきでしたね…
今回で緑直前まで来たので次回上がれるようにがんばります.

ABC156参加

ABC156に参加しました.
結果はこちら
Fortranで3完でした.

A問題

$N \leq 10$なら$R+100(10-K)$を, それ以外なら$R$を出力して終わりでした.

B問題

$N$を$K$で何回割れるか数えて回数を出力して終わりでした.

C問題

$N$, $X _ {i}$共に小さかったので$P$を$X _ {i}$の最小値から$X _ {i}$の最大値まで回してその時の消費する体力の総和で最も小さくなるものを出力して終わりでした.

D問題

問題文読んでから5分くらいで$2 ^ {n} - {} _ n C _ {a} - {} _ n C _ {b} -1$を計算すればいいことは見えたのですが, ${} _ n C _ {r}$を$10 ^ {9}+7$で割ったあまりの求め方がわからなくてずっと求め方を調べていたら終わってしまいました.
悲しい.


今回, D問題の考察までかなりいいペースだったのに実装でやられてしまいました.
もしコンテスト開始20分くらいでD問題まで通していたらパフォーマンスが1400行ってたので緑化してたようです…
悔しすぎてキレそう…
達成できたのにできなかった…↓

コンテスト終了後ひたすら発狂してました…
今回ライブラリを持っておくことの重要性を身を持って実感したので今日明日にもmodのライブラリ実装します…
3/1にABC生えてくれぇぇぇぇぇ

ABC155参加

なんだかんだ書いてなかったので書きます.
ABC155に参加しました.
結果はこちら.
自分でも驚くほど激冷えしました.
今回はFortranで2完, Python3で1完でした.

A問題

入力された変数を配列に格納→ソート→隣同士で同じものがあってかつみんな同じじゃないか判定しました.

B問題

先頭から順に見て問題文のとおりに判定しました.

C問題

かっこつけてPythonで辞書型使ったらバグりました(敗因).
最終的にソートして隣同士が違うものになるまで足し算して出現回数を数え, 出現回数の最も多かったものを辞書順に出力しました.


かっこつけちゃだめですね…
(これ以上の感想が出てこない...)

ABC154参加(公式バチャ)

ABC154にバーチャル参加しました~
結果はA~Dの4完でした
今回は全部Fortranで出しました(や っ た ぜ)

A問題

$S$ と $T$ のうち $U$ と同じ方を1だけ減らして終わりでした.

B問題

$S$の長さを取得してその分だけ'x'を出力して終わりでした.

C問題

数列$A$をソートして隣り合うもので等しいものがあれば'NO', なければ'YES'を出力して終わりでした.

D問題

各$p _ {i}$について期待値を求め, 累積和をとったあとに$K$の間隔で引き算して終わりでした.

E問題

場合の数でやろうとしましたが$N$の桁数のときの扱い方がわからずに詰みました.
恐らく$i (K \le i \le (Nの桁数-1))$のときは愚直に  9 ^ {K} \times 10 ^ {i-K} \times { } _ i  C _ {K-1} を計算して足していけばいいと思います(間に合うかわかんないけど最大で100桁だから間に合うはず)

F問題

 \sum _ {i=r _ {1} } ^ {r _ {2} } \sum _ {j=c _ {1} } ^ {c _ {2} } {} _ {i+j} C _ {i}
をうまいこと2項定理を使って式変形させてあげれば行けると考えたのですが式変形がうまくいかず(数弱の極み)だめでした.


解説を見たらE問題はDPを使って解く問題だったんですね…
EDPCをもうちょっとまじめにやってたら解けたかもしれない…
F問題はなんか似たようなことを考えてる気もしますが…(正直良くわからん)
とりあえず昨日同じペースでできてれば緑色直前まで行けたっぽいです.
また次がんばります

ABC153参加

ABC153に参加しました.
久しぶりに5完しました!
やったね!
コンテスト成績はこちら
今回はFortranで3完, Pythonで1完, C++で1完でした.

A問題

FortranでACしました.
 H/Aして, 小数点以下を切り上げて終わりでした.

B問題

FortranでACしました.
 A_{i}の総和が Hより大きいかどうか見て終わりでした.

C問題

FortranでACしました.
モンスター全員の体力の総和から, 大きい順に K匹分のHPを引いて終わりでした.

D問題

Python3でACしました.
モンスター全員の体力を Xから \lfloor X/2 \rfloorにする操作を1回としてカウントすることにします.
条件から, 1回の操作でモンスターの数が2倍に増えること, そして最初のモンスターは1匹だけであることから i回目の操作におけるモンスターの数は 2^{i-1}となります.
よってモンスター全員を倒すためには Hを2で割ることのできる回数(商が0より大きくなる回数)を Nとして \sum ^{N} _{i=1} 2^ {i}となることがわかります.
以上から Hを2で何回割れるか数えて \sum ^{N} _ {i=1} 2^ {i}を求めれば終わりになります.

E問題

C++でACしました.
サンプルケースから規則性が見られず, あとはなんか A _ {i}が報酬で B _ {i}がコストっぽく見えたので直感的にDPかな?って思ってみてました.
その後, 制約を見ると HN 10 ^ {7}だったのでここでDPだと確信して紙DPをして遷移式を考えました.
 N H列のdpテーブルを考えたときの遷移式は以下の通りです.

$$ dp[i][j]= \begin{cases} \lceil B[i]/j \rceil \hspace{10pt} (i=1)\\ \min (dp[i-1][j],B[i]) \hspace{10pt} (j \leq A[i])\\ \min (dp[i-1][j],dp[i][j-A[i]]+B[i]) \hspace{10pt} (others) \end{cases} $$


久しぶりの水パフォでHighest更新です!!
やったね!!! 3月末までに緑色がだいぶ射程圏内に入りましたね.
今回のセットは全体を通して統一感と言うかストーリーというかがあってとても楽しかったです.
多分次回は冷えると思いますが極力冷えないようにがんばります.

ABC152参加

ABC152に参加しました.
激冷えしました…
コンテスト成績はこちら
今回遂にFortranで3完しました.

A問題

 N=Mの時にYes、それ以外の時にNoを出力して終わりですね. はい()
提出コードはこちら↓

atcoder.jp

B問題

 min(a,b) max(a,b)回だけ出力して終わりですね. はい()
提出コードはこちら↓

atcoder.jp

C問題

無限に時間を使いました…
最初は隣同士で降順になっているものの数を数えればいいかと思っていたらWAになりました(それはそう).
結局先頭から降順になっているものの数を数えることでACしました.
WAしたコードはこちら↓

atcoder.jp

ACしたコードはこちら↓

atcoder.jp

E問題

問題文から全ての Aについて A _ {i} B_ {i} = A _ {j} B _ {j}となれば良いことから A _ {i} B _ {i} Aの最小公倍数になれば良いことがわかります.
そのため、最小公倍数を求めてから全ての A _ {i}について商を取って足して最後に 10 ^ {9}+7との余りを取れば終わりのはずでした.
計算結果が非常に大きくなることが予想されたためさすがにこの問題はPythonで書きました.
が、

f:id:jj1guj:20200119232811p:plain
はい??
は?
f:id:jj1guj:20200119232903p:plain
制約ギリギリの自作データで試した結果
はああ???
結局これに詰まって時間内にACできませんでした.
悔しい…
f:id:jj1guj:20200119233303p:plain
発狂しまくった後に残った結果
追記
結局最小公倍数を出した後に 10 ^ {9}+7との余りをとり、各 A _ {i}の逆元をかけることでTLEされずにできるようです.
逆元の生成についてはこちらを参考にしました↓

qiita.com

後日ACしたコードはこちらです↓

atcoder.jp


解説読む限りE問題はどうやら最小公倍数を素因数分解した状態で持っておくべきだったようですね.
この前冷えないように頑張ると言ってたのに冷えましたね…
知ってました()
とりあえず3月末までに緑色になれるよう頑張ります.
はああああああああああああ

追記
なんだかんだでFortranで1st ACしてた.
やったね

f:id:jj1guj:20200120104446p:plain
やったぜ!

ABC151参加

ABC151に参加しました.
ratedになってしまいましたね*1
コンテスト成績はこちら
今回はC++で1完、Fortranで2完でした.

A問題

C++で出しました.
C++だと

cout<<(char)(c+1)<<endl;

でできるので便利ですよね*2

B問題

Fortranで出しました.
いちいち平均を求めると面倒だし下手すると数値がずれていってしまうため、必要な合計点から得られた得点を引いていくのが最善ですね.
それで最後に出てきた値がマイナスならゼロにして、満点より値が大きかったら-1を出力すればできました.

C問題

Fortranで出しました.
ほぼほぼ実装ゲーでしたね.
ACしなければペナルティは生えないことを知っていますか?僕は知りませんでした()
ちなみにこれで2ペナ生やしました.

D問題

たぶんDFSすればACできると踏んでいましたがここら辺でお腹が空いたのでご飯を食べにいきました.


できたらFortranで3完したかったですね.
どう考えてもコンテストの途中でご飯食べにいくのどうかしてますよね.
以後気をつけます()
どうやらF問題は恒例の数学問題*3だったようなのでご飯食べに行かずにやるべきでしたね.
まぁとりあえずHighestは更新できたのでよしとしましょう()
いつもHighest更新した後のコンテストではだいたい冷えてるので次はとりあえずレートを冷やさないように頑張ります.

*1:chokudaiさんの坊主頭が見れなくて残念です()

*2:Fortranもひょっとしたらできるのかもしれない(知らん)

*3:こるとんさんがwriterに入るといつも数学問題が出題されてる気がするのは僕だけ??