/ 最近 .rdf 追記 設定 本棚

log[AtCoder: 2021-03-17]



20210317()

最終更: 2021-03-24T16:47+0900

[AtCoder] AtCoder Beginner Contest 067D 問題 Fennec VS. Snuke

解いたあとで他の人の Ruby での解答を見たらバリエーションがいくつか見られた

 解法1:ーを2本用意してフェネックすぬけくん双方のスタト地点から各ドまでの距離を幅優先探索などで確定しそれからドの塗り分けをする

これが一番多かったと思う。公式解説に書かれている通りの手順

 解法2:1本のキーでフェネックすぬけくんが交互に陣取りをしていく

これは Ruby で最速の qib さんの提出 #20369253 (191 ms) の解法

公式解説にはこう書かれている

マス ij の距離を d(i,j) として,マス i の色は d(1,i)d(N,i) ならば黒,そうでなければ白とな結論としてマス 1 とマス N2 点から幅優先探索や深さ優先探索などを行うことで O(N) でこの問題を解くことが可能であ

解法1はたしかに解説通りの手順ではあるが解答にあたり具体的な距離まで知りたいわけではなく距離の大小関係だけ知れれば十分なのだ

解法2の手順は(スタト地点からの距離を測定する)幅優先探索に則っているのだが一見すると1手につき1マスしか塗れないゲームのルールに反しているように見えるのが難しい同じことは解法1にも言えてマス i の色は d(1,i)d(N,i) ならば黒,そうでなければ白となるが納得できるかどうかに尽きるのだけど解法2の手順がなまじゲームに似ているせいで考えてしまう

 解法3:自分の>提出 #20999230 (208 ms) やや遅くメモリ消費も多い

ェネックとすぬけくんの行動原理として想定したのは公式解説のものと同じ見立てだけが異なるどういう見立てだった

ェネック(すぬけくんでもいいが便宜上フェネックを選ぶ)のスタト地点を木の根と定めてすぬけくんのスタト地点の深さを知るすぬけくんは移動可能範囲を広げるために根に向かって移動するェネックはすぬけくんの移動可能範囲を狭めるためにすぬけくんに向かって移動する出会うのは中間の深さすぬけくんは根に向かって移動できなくなった地点を根としてその子孫ドだけを塗ることができる(だから一直線に根(ェネックのスタト地点)を目指していた)

結局のところこの問題は一本の辺を見つけ出す問題だった頂点集合をフェネック側すぬけくん側に分ける辺がどれかを見つける問題だった

その手順として幅優先探索(解法1)とその応用(解法2)と深さ優先探索(解法3)とダイクトラ法(未紹介)いろいろな方法があって実行速度の差があった同じ線形時間でも1回なめるだけで済ませられるのか2回か3回

 AtCoder Beginner Contest 148F 問題 Playing Tag on Tree

今日@2021-03-23 たまたま取り組んだこの問題が同じ方針で解けそうだった

2地点から深さ優先探索で陣取りをしていって中央付近でにらみ合ってそれからどれだけ相手陣へ侵攻(自陣へ後退)できるかを数えれば答えになりそうだった

 提出 #21207034 (WA×1 after_contest_01)

っちりと隙を見せない after_contest に撃ち落とされましたとさ

競技プログラミングをするフレンズ @kyopro_friends

ーバABC148FPlaying tag on treeafter_contestを追加したよ! 不等式に等号を入れるか入れないかを間違ってるコドが落ちるようになったはずだから確認してみてね」https://t.co/jcHP4lHFhg

Twitter
 提出 #21208328 (AC)

不等号などなかった先攻後攻を入れ替えたのと自陣へ逃げ込もうとしてうっかり中立地帯へ迷い込まないように道を塞いだ

当初方針のまま after_contest に対応したがどうにも不自然に頑張ったようなコドになってしまったこの問題に関しては想定解法通りに2通りの距離表を見比べて答えを選び出すのが良かっただろう

ところで ABC148 はオンタイムで参加していたA-D まで灰 diffE 問題に至ってもギリギリ緑という低難度回F 問題でやっと水 diff 中位だったらしい当時1時間を残していながら解けなかったのがこの F 問題何を考えて解けなかった

木の上で追いかけっこをする2人がすれ違うことができないということが認識できていなかっただから偶奇が適切な部分木を選んで逃げ込むことで追跡が躱せるような気がしていたそれじゃあこの但し書きが嘘になるのにねなおームは必ず終了することが証明できま そんなん考えたら青 diff 上位DFS Gameより難しくなるってのにね


20210313()

最終更: 2021-03-15T22:56+0900

[AtCoder] パナソニックプログラミングコンテAtCoder Beginner Contest 195F 問題 Coprime Present

本日の ABC1時間かけて ABCD の4完で残り40分考えて E 問題が解けずに終わったーム問題苦手勝ち筋とか必勝法とかっぱり見えない自分はこの先攻後攻が決まった瞬間に勝ち負けが見えるゲームをっと楽しくプレイできるんだろうなあ

本番中に E 問題が行き詰まっている最中に F 問題をタトルだけチラ見していたCoprime の単語が見えた瞬間にあきらめた別の問題だけど先々月Coprime はまた解けなかった 完全に苦手意識を持っている素数とか見たくない

 提出 #20911347 (TLE×19 / AC ×17)

割と大きめのサンプル3が通ったのでいけると思ったが TLEった

考えたことを順番に

  1. BA72があからさまな弱点
  2. AB 自体は 10^{18} になりうる大きな数なので互いに素をどのように確かめる
  3. 72 以下の素数で割ってみればいい
  4. [A,B] の区間から作ってはいけないペアが列挙できたがこれを 2^{B-A+1} 通りの組み合わせからどう除外する
  5. () ペアの左側をマージしたビト列とペアの右側をマージしたビト列を用意して2^{B-A+1} 通りを振り分けよう……実行が終わらない
  6. () ペアを併合したグループを使って解けないか……解けない
  7. 愚直にカドを1枚ずつ引いて使う場合と使わない場合で深さ優先探索を……これがさっきの TLE 提出

 提出 #20911691 (AC / 357 Byte / 221 ms / 14628 KB)

このとき(diff精進3問)解いた問題の1つABC 115 D - Christmasなんだけど素直に問題の通りに書いた最初の版が明らかに TLE を免れなくてださいけど if を使って2回の再帰呼び出しを1回に節約するパスを追加することで AC になっていた

倍倍ゲームになりうる再帰構造には特別な警戒が必要だということとそれが反転したときに改善効果が劇的だということを学んでいた今回も最後の lambda F に2行追加して AC

 () ペアを併合したグループを使って解けないか……解けない

たぶんグループの作り方が間違っていた二次ペア三次ペアと芋づる式に相互グループを作るのでなくそれぞれの数ごとに一次ペアのグループを作ってそのサイズでクラス分けをすれば計算で答えが求まったのではない計算の材料にする数字が誤っていたから求まらなかったのではないいやでもそのクラスには公倍数の情報が抜けてるのか……

 72 以下の素数で割ってみればいい

組み合わせた結果をルタリングするよりもルタリングした結果を組み合わせるべきだったのではないSQL がそうでしょう? JOIN する前に WHERE で絞るべきなんだWHERE に似ていても HAVING では遅いんだ

全探索がダメでもある種の探索が許されていたあたり今日の制約には優しさが感じられるなあ


これに関連した @kyopro_friends さんのツイトを考えていた

競技プログラミングをするフレンズ @kyopro_friends

アライグF問題はCOLOCON2018C『すぬけそだて――ごはん――の難しい版なのだ! gcd(x,y)=gcd(x-y,y)|x-y|だから72以下の素数の倍数が重複しないようにすればよくてどの素数の倍数をもう使ったかでbitDPすればいいのだ!

Twitter

gcd(x,y)=gcd(x-y,y)|x-y|ってつまり……

  • 1000010010 のように近接した2数があるときその公約数が 10000 近辺にあることはないのだなあ
  • 大小2つの数とその差(正の方)という3つの数があるときこれらは GCD を共有しているのだなあ
  • x-y を繰り返して行き着く先は x%y だけどなんだかこれってユークリドの互除法……

というような発見があったものがよく見えていない「新発見が多いークリドの互除法まで見つけてしまった開拓者か研究者に向いているのではない


20210224()

最終更: 2021-03-23T20:00+0900

[AtCoder] SOMPO HD プログラミングコンテ2021(AtCoder Beginner Contest 192)F 問題 Potion

解説を読んで ABC をコンプリトしようシリーズの1回目ABC192 で残っているのは F 問題いわゆるポーションって portion とはスペルが違ったのね

2回目があるかはわからない1回目にして解説を読んでから2日間苦しんだDPったんだけど人類が扱うには次元が高すぎるのではないかな? 自分には無理

 提出 #20468517 (AC / 614 Byte / 1451 ms / 18204 KB)

ースコドの冒頭にも引用したけど解説の要諦が次の一文

dp[i][j][k] = i 番目までから j 個選んだときの和であってmod Ck に等しいようなものの最大値

https://atcoder.jp/contests/abc192/editorial/705

自分は最初これを次のように解釈した

dp[i][j][k] = i 番目までから j 個選んだときの和であってmod jk に等しいようなものの最大値

微妙な違いがわかりますか? mod Cmod j の違いっかりミスではなく理解できる範疇を超えていたからこれってこういう意味だよねと一段次元が低い誤った理解しか生まれなかった

引き回すデータ配列の構成を教えてもらってさえ遷移が書けるまで一日かかったんだけどいざ完成したらこの微妙な勘違いのせいで時々答えが合わなかった時々答え合わせに使ったのは次のナイーブな解答スクリN30 を超えると実行時間が現実的でないので生成する入力の N は小さめにトケースはまだ利用できない

N,X,*A = $<.read.split.map(&:to_i)

p (1..N).filter_map{|c|
	k = X%c
	m = A.combination(c).map(&:sum).sort.reverse_each.find{|m| m%c == k }
	(X-m)/c if m
}.min

要するにこれを時間制限に収まるように書き直しましょうという問題だったそれが難しい

結局一度完成したと思ったスクリトを囲うようにもうひとつループを重ねた法が変わると余りは再利用できない最初から目的地(C)を定めて j を変化させなければいけないdp 配列の添字 k の上限は j でなく C である無理だよ明日にはもう自分でこの文が理解できないよ


DP であることでナイーブな解答より有利になる点は次の2つ?

  1. j+1 個の組み合わせを生成するのに j 個の組み合わせ結果が利用できる

    その際にキーとなるのが添字 i (i 番目までから j 個選んだときの和であって)j 個の組み合わせ結果を i (1N-j)によって分類しておくことでj+1 個の組み合わせを作るのに利用できる

    たぶんこれって DP のひとつの典型なんだと思うけど配列の型を示されてさえこの種の遷移(何を残して何を再利用するか)を見つけるのに1日かかった

    見つけた遷移は具体的にはjC まで増やしながらある j について i 番目の要素(A[i])i の大きい順に考えるA[i] を採用しないときに dp[j][i] に対応する C 要素の配列は dp[j][i+1] のものと同じA[i] を採用するときは dp[j-1][i+1] に記録された C 個の値と組み合わせる ij が解説とは入れ替わってら

    dp[j][i] の値を作るのに dp[j][i+1] (最内ループの直前の値)dp[j-1][i+1] (中間ループの直前の値の1要素)を再利用している

    勘違いして見えていなかったのはj=C であり j1..N の範囲で変化させる過程で各 j(C) に対応した答えが見つかる……のではなくC=1..N について j1..C の範囲で変化させなければいけないということ

  2. 組み合わせた結果の和を mod C で分類して最大の値だけを採用することで無駄な組み合わせが省ける
  3. あとはまあ組み合わせる数は多い方が初期値の点でも経時増加量の点でも有利なのでープを降順にして途中で打ち切り条件を設定したりしただけど special_xx.txt に類するケースがスペシャルな理由はこうした打ち切りが無効なところにありそう

  • 提出 #20486969 (TLE×11)

    主にイテレータを使って書き直したので遅くなるのはわかる

    Array#min の代わりに Array#[] でダイレトに最小値を取得するようにしたのでspecial_xx.txt 以外のケースでは改善している

  • 提出 #20486969 (TLE×11)

    同じように Array#min を使うのをやめたのとイテレータを使わず全て while で書いたspecial_xx.txt 以外のケースで上よりさらに少し改善しているがTLETLE

    Ruby って整数演算が足す引く剰余大小比較までどれも同じくらい遅い雰囲気演算コトに差がないなら演算子の数を減らす方がいい?

    でもどこに 800 ms も遅くなる要因があった? もう予測できない

 提出 #20581154 (AC / 615 Byte / 1437 ms / 15868 KB)

平均すると最初の提出より1割弱タイムが改善しているけど意味のある差ではない

ースはイテレータメインの提出 #20486969 (TLE×11)

ACTLE の分かれ目は4重ループの最深部にあった

  1. 初期値を正の無限大ではなく nil にした

    正の無限大は正常値として扱えるので記述が統一できるのだけどむしろ異常値として nil-1 や無限大を設定・検知してープをスキップするのが良かった

    ところで想定上限を整数で表現しようとすると 6768トが必要になる気がして採用できなかったFloat::INFINITYBignumどちらがいいともいえない打ち切り条件が ×C ではなく ÷C である理由でもある

  2. 余り(k)の計算は、k = m%ck-=c if c<=k よりも「実行されないコドが最速なのだった負の添字を使った配列参照は組み込まれた機能でありコトは支払い済みなので使い倒さなければ損になる

いくつかの C について最小公倍数で余りをとればより外側のループで DP 配列が再利用できるのではない数列 A の偏りと C の組み合わせを調べればk が取り得る値が C 種類より少なくなるのを見抜けるのではない結局のところTLE の原因はおそらく X%CA%C() がまったくマッチしないせいで4重ループを最初から最後までフル回転させられるせいだと思うから

 提出 #20639856 (AC / 870 Byte / 1167 ms / 24016 KB)

「いくつかの C について最小公倍数で余りをとればより外側のループで DP 配列が再利用できるのではないかを実装してみた話を単純にするために C が偶数の時に j=C/2; i=0DP 配列を C=C/2DP 配列として再利用した

たとえば N が上限の 100 のとき51..100 は普通に DP をする1..50 は再利用配列を使用して DP をしない限界は次の2点

  • C が大きいときの方が DP の処理量が多いので全長の下半分の節約は処理時間にすると4分の1以下の短縮効果にしかつながっていない
  • special_xx.txt 以外のテトケースでは打ち切り条件が有効に働くのでDP の節約効果が日の目を見ないどころかただオーバーヘドを増やしただけになる

 @2021-03-05トケース

ースXX (素因)A に含まれる 9999999 の数答えが見つかる C
special_01.txt52142908377193267103×4703×10764231956301
special_02.txt48620189947792921131×2719×18713×729445312
special_03.txt70227681074731923770227681074731923723
special_04.txt651020109319638361162011×231599×1735054934
special_05.txt61168850281850484182936769××737535968945
special_06.txt857415171960730822×11257×32587×11686759956
special_07.txt794433313787770441101×74910361×10500118167
special_08.txt515779426304609041101×510672699311494178
special_09.txt8962979337589569513×22769×1312161174929389
special_10.txt908429522499966622×24335153×1866496427910

N はすべて 100数列 A の要素はほとんどが 100000000から9個が 9999999 という構成

special_xx.txt が入力する数列 A の中に値の種類は1から2個しかなかったC 個選んだ和の余りがとる値は限られた 9999999 がいくつ含まれるかでしか違いが出なかったつまり1から10種類それでも C1..N の範囲で変化するうちに余りの数字(k)自体は変化していくしX%C も変化するんだけどどうやったらぎりぎり最後までマッチングしないような X が選べるんですか?


20210221() ARC の方AB 問題は通せへんとあかんかったな(最終的に WA が2ケース)C 問題は読んでないよなおAtCoder Problems によると C 問題でもギリギリ緑色という難易度のようC 問題までさっくり通せるべきだったね。CBこれをコンテト時間中にだね……

最終更: 2021-04-06T17:58+0900

[AtCoder] SOMPO HD プログラミングコンテ2021(AtCoder Beginner Contest 192)B,C,D,E

昨日あった ABC今晩には ARC があるので復習が忙しい

 B 問題 uNrEaDaBlE sTrInG

正規表現を乱用する問題だと決めつけて考えた使える限り最善でなくてもかえって難しくなっても正規表現を使う

 提出 #20290278 (AC / 50 Byte / 62 ms / 14440 KB)

パターンには改良の余地があるたぶん /^([a-z][A-Z\n])+$/ で良かった

$ は改行の前でも文字列の末尾でもマッチしたと思ったけどフラグの影響がどう出るかが不確かだそして Ruby のフラグは JavaScript のフラグと比べてあべこべな雰囲気がしてわかりにくい

入力が英大文字小文字だけだから大小の判別は1ビトを見るだけでいいんだけど正規表現だから関係ない

 C 問題 Kaprekar Number

C 問題にしては……と疑いをもったがーに大きい桁を与えてもいけるみたいだったので問題の通りに関数 f を定義してシミュレーションした本当はテーに大きいだけだとすぐに桁数の少ない値に収束してしまいかねなくてそうではない嫌らしい値が与えられるかもという疑いがまだあったのだけどとりあえず投げてみるスタイル

 提出 #20296774 (AC / 157 Byte / 560 ms / 14324 KB)

最近誰かがツイトで Integer#digits メソドに言及していたので初めて使ってみた適所では? そういえば D 問題でも使っていた適時(タイムリ)

 D 問題 Base n

ってきました因縁の D 問題前回の虐殺劇が記憶に新しい>20210206p01.02今回も E 問題が緑色なのに対して D 問題が水色だったりして正答数に逆転があったもよう

あれ? やるだけ? という感想はあまりに素直たしかに優秀な人は目をつぶっていても答えにたどり着けるのかもしれないが凡人は周到に落とし穴を探し出さなければいけない

 落とし穴1:基数が変われば必ず得られる数が変わる?

それは1の位についてだけ当てはまらない基数が3でも4でも5でも数1は0より大きい1番目の数で変わらない

そしてこれが基数の種類を答える問題でないことの傍証になる(そういう誤読が多かったらしい)無限大の答え方が問題文中にないからだ

 落とし穴2:その式d+1M(+1) に暗黙の大小関係を仮定していませんか?

二分探索の下限に d+1上限に M+1 を設定していたのだけどM+1 の方が d+1 より小さいことがあるから答えを導く引き算の結果が負の数になるケースがあった

手で計算しているときは自然と自然数の範囲でものごとを考えてしまって例外ケースを無視してしまいがち

早期に AC を得ていた複数の人が上限を定めない二分探索を行っていたようだkotatsugame さんがこの奇妙な二分探索の振る舞いについてツイトしていたので存在は知っていたが自分で使えるほどには知らないし思い出さない

 提出 #20335649 (AC / 212 Byte / 64 ms / 14580 KB)

7 WA のあとの ACどちらの落とし穴もテーな入力を与えて出力を見るデバッグで発見した1桁のケースはタイプするのも簡単だしそれでいて境界に近くてバグが潜みがち嗅覚を働かせよ

えびま @evima0

(D 実はもとも9 1っていうサンプルがあったんですが出題の意義が 1/3 くらい消滅する (1 9だと 2/3) ので消してもらいまし) https://t.co/NNcbAu6GjF

Twitter

このツイトはもっともでそうでなければ D 問題としては易しすぎて出題されなかったと思うといってもこれだけいくつも罠があって目配りが要求されるならAGCA 問題といった風情もある

自分より上位の人は仮に D 問題の罠にはまったとしてもさくっと E 問題を片付けてから帰ってきて結局 ED も通してしまうというムーブができてしまう(そもそも罠にはまらないか)それができるからこそそのレイングなのだ自分がそれをやろうとすると虻蜂取らずになるのが目に見えているので1時間かけて D 問題を通しました今回の成績はABCDの4完最遅レベルでレトは横ばい

競技プログラミングをするフレンズ @kyopro_friends

ェネ「もともとD問題でX1文字のケースをアライさんは2個か3個しか用意してなくてそれだとWAのケース数でコーナーケースがバレそうだからたくさん増やすようにドバイスしてみたんだけどどうだったかな?」https://t.co/FxcvbhUJNL

Twitter

AC が出るまでは WA の数を見て方針を疑ったり挫けそうになったりしたけど1アイアで 7 WA1 WA にまで減ったりしたからまあこういうことなんだろうと予想はしていたまんまと手のひらころころ

 E 問題 Train

プライオリーを書くだけの問題まあそ「書くだけができなくて 2 WA するのが自分なのだけど

 提出 #20371092 (AC / 998 Byte / 594 ms / 48260 KB)

……だと思ったらRuby で最も速い複数の提出が Hash を待ち行列に使っていたkeys.min で最小値を都度取り出す使い方でそれでいて速いえええ?

あと久しぶりにプライオリーを書いたから速度改善テクニックを1つ忘れていたープを整理するときに都度都度要素を交換しながら上昇(下降)するのでなくてーテーションする感じでいくつかの要素を順番にスラドさせてできた空きに追加要素を置くのがいい


20210216()

最終更: 2021-05-07T14:00+0900

[AtCoder] AtCoder Regular Contest 112A,B,C

先週末の ARCABの2完でレトは横ばいっと背伸びして C 問題が今やっと解けたので日記にする(べつに考え続けていたわけではなくてオラクルが降ってくるのを待っていたのです)

 A - B = C

 提出 #20145565 (TLE×8 / AC×4)
 提出 #20146816 (AC / 96 Byte / 93 ms / 14500 KB)

一応制約は掛け算していたんだけどまずは素直に数えて確実に答えを……TLE見れば一次 の k のΣなので機械的に変形して……AC

間違った式の変形に5分以上の時間をかけてもしーないのでTLE は避けられない今は(ARC の1問目に対しても)ステップを刻まなければ答えにたどりつくことさえ覚束ない

 B - -- - B

どれだけ1円を払っても数の種類は1しか増えないので基本となる操作は何回2円を払って絶対値を変化させられる±B が境界として存在していて|B| から 0 へ向かう変化と -|B| から負の無限大へ向かう変化が考えられる反対側の値は1円余らせておくだけでいい0 を挟んで -B から B の範囲を数えるのが面倒親切にも B=0 となるコーナーケースがサンプルのひとつになっているもうひとつのコーナーケースが C=1

 提出 #20157041 (AC / 204 Byte / 63 ms / 14300 KB)

2 WA のあとの AC±B0それらで区切られた4つの区間を愚直に数えた

 提出 #20182663 (AC / 145 Byte / 65 ms / 14268 KB)

翌日になって機械的に式を整理したものできれば if による分岐を消したかったのだ

 C - DFS Game

問題の見通しは難しくない表のスコアと裏のスコアと手番を渡すか否かのフラグ(子孫ド数(=スコア計)の偶奇)があってそれらを葉からトムアップで積み上げていけば先手後手のスコアが即座に解る

制約の 1pv<v の解釈に一瞬詰まったけどpv の上限が v であることで逆向きにスキャンするだけで子から親へ順序よく処理できる親切設計だとわかった

最後まで解らなかったのは青木君高橋君が採用する最適な行動がいかなるものである二人が何を指標にしてどの子を選ぶのかそれが解らないでどうしてコングができる? 何をコドにする? 自分はこの先攻後攻が決まった瞬間に勝ち負けが見えるゲームをっと楽しくプレイできるんだろうなあ

 提出 #20211491 (AC / 568 Byte / 352 ms / 49992 KB)

odd.sort_by!{ _2-_1 }even.each(...) がキモこれが二人の戦術


最後まで見えなかった even.each についてもう少し

even は潜って戻ってきたときに手番が入れ替わらない子ドを集めた配列表のスコアが裏のスコアより高いものは手番(※広辞苑にはテツガイの見出ししかないテバンは業界用語か?)を持っている方がさっさと潜って表のスコアを得てしまえばいい(裏のスコアは相手に渡る)では裏のスコアの方が高いものは?

裏のスコアの方が高いものはできることなら相手の手番で相手に選ばせたいそうすれば表のスコア(低い)が相手のものに裏のスコア(高い)が自分のものになるそれが可能になるのはって戻ってきたときに相手に手番が渡る子(odd 配列)が奇数個ある場合手番というババの押し付け合いに勝てる

 提出 #20212523 (AC / 432 Byte / 255 ms / 54588 KB)

Ruby の他の AC 提出(今のところ2つ)と比べて遅かったので出し直し100 ms 縮んで遜色がなくなった省メモリを目論んだが結果的に増えている配列の配列の配列がよくない

ところで再帰呼び出しを行っている解答を手元で実行してみたらいくつかのケースで stack level too deep (SystemStackError) が出て速度比較ができなかったPC が貧弱なんだな(環境変数か? その解決法ーピングぽい)


20210206()

最終更: 2021-05-07T14:21+0900

[AtCoder] AtCoder Beginner Contest 191C,D,B(空白とスペ)

今日の ABCCD はちっと傾向が違ったよね(EF は時間切れで読んでいない)C はむしろ復古的かもしれないけど

 C 問題 Digital Graffiti

どこに着目すれば数えられるのかわかりますか? わかりません

 提出 #19978760 (AC / 969 Byte / 62 ms / 14484 KB)

ーに注目して数えて(÷2では)ダメだとわかって(÷3で)やり直して31 分かけて鬼の羅列である

(構造の)理解に頭が必要ないという意味でこれも可読性に優れた読みやすいソースコドの例なんですよ似たような例にすべての繰り返しを forープで書くなんてありますねfor さえ解れば鬼に金棒馬鹿の手にハンマ目に入るすべては釘打つべし打つべし

だけどプログラムは構造化と抽象化を(必要である限り)繰り返して人間はよりハイレベルな意味を読み取らなければいけないんです。あれをどーしたこーしたなんて作業手順を(人間に向けて)仰々しく並べ立てることに意味はありませんそれはソースコドの役割であって人間に向けたコメトには意味のあることを書いてください

 「黒に塗られた部分は一つの自己交叉のない多角形となることが保証されます。すなわち

これって黒のマスが1つの塊(ーナツではない)であって黒の内部に白のマスが島になっていることがない(逆に黒のマスはたった1つの島になっている)ってことだと読んだそのあとで補足的白に塗られた任意の 2 マスは辺を共有するマスへの移動を繰り返し白に塗られたマスのみを通って互いに到達可能である(マス目の一番外側のマスは全て白に塗られていることに注意してくださ)ともあるし問題文は慎重に 書かれていたと思う

多角形の解釈についても色が塗られたグリドであって座標空間上の点列ではないのだから書かれていないものを見ようとして見るべき角が見えていなかっただけでしょう

数学の言葉で書かれた制約の読解に普段苦労するので(20201122p01)今回の問題文に文句はない

 AtCoderの何角形問題についてです https://t.co/kVNwsq8xSC / Twitter

すごくいいそうかト絵師と 3DCGモデラーがいただけなの

 D 問題 Circle Lattice Points

図形です。

制約が 10^5 だからどうかなーと思ったけど普通に数えられる範囲だったみたい手元ではサンプルに2秒以上かかってたんだけどッジサーバーは速かった

 提出 #20002500 (AC / 606 Byte / 833 ms / 14420 KB)

1時間かけてコンテト終了1分前の提出よかった……よかった……

格子点を数える問題で入力を小数で受け取るのはやっぱり怖い小数点以下第4位までって書いてあるので(文字列のま) 10000 の下駄をはかせてついでに諸々の座標が正の範囲に収まるように平行移動した負の数が混じると整数除算の丸め方向が期待と異なっていて面倒くさい

# 0 を足すと答えが変わります。難しすぎるでしょ?

 -1/2 #=> -1
0-1/2 #=> 0

# 1 (イチ)が変数 l (エル)で、中身が正の数だったり負の数だったりすると、もう予測できないでしょ?

上記は Ruby の挙動仲間はずれらしい>整数同士の除算演算子の挙動 (C言語C++ScalaJavaRustGo言語PHPJavaScriptPerlPythonRubyElixir) - Qiita Python の整数除算(//)も同じく負の無限大方向に丸められると

他の人の Ruby での提出を見ると入力を to_r するものが多かったrRationalr. 使ったことがないと使えないし思いつきもしないのだ

二分探索の探索範囲をちまちま限定したところで倍の違いが試行1回の違いにしかならないのだから2つのループは1つで十分でしたねこれは円を4分割して数えられないか考えていたのが尾を引いている


競技プログラミングをするフレンズ @kyopro_friends

アライグD問題は円の中の格子点のx座標としてありえる値の範囲がX-RX+Rだからx座標を決めたときの格子点の個数が求められればいいのだ! 誤差が大変だから整数で計算して負の数の切り上げや切り捨ての計算に気をつけて……罠がいっぱいあって大変なのだ」https://t.co/6z8erFU3Ym

https://twitter.com/kyopro_friends/status/1358048807145992193

実は二分探索がいらなかった>画像三平方の定理! 中学生!

 提出 #20013918 (AC / 265 Byte / 125 ms / 14404 KB)

三平方の定理速い! 短い!

Integer#sqrt なんてニッチなメソドを使ってみた

ところでっぱり **2 は遅いみたい引き算を2回評価することになっても覆らないくらいに


Ruby での提出を早い順に見てるんだけどどの人もどの人も平方根をとって計算で格子点の数を求めていた10行以下のスクリトでそれが間違いなくすごいんだけど(って開始後30分ぐらいでの無駄なく短い提出だ)それらをことごとく撃墜した3つの入力(handmade_marginal_{01|03|05}.txt)今回はいい仕事をしていたなと単に to_fto_r にしたところで三羽烏のひとつしか超えられないみたいですよ

Rational だけでなく BigDecimal の存在も忘れていたこれ任意の精度で 10 進表現された浮動小数点数を扱えま to_dd(big)decimald. to_fto_d にしてもやっぱり3つのうち2つが WA になるようなのはBigDecimal#sqrt を使わないで Math.sqrt を使っているのが良くないんでしょうMath モジールは標準とはいえ require が必要な添付ライブラリである BigDecimal を知らないのが普通だと思う

提出して確かめようとしてわかったBigDecimal#sqrt を使うとサンプル3で既に TLE が避けられない

 Ruby で一番最初に AC をとった提出 #19982442 (vmi)

入力は Rational で受け取っているMath.sqrt の結果を検算して条件を満たす限り±1の微調整を施し続けているそして大事なことは±1した結果の正当性も確かめている

単純に±1するだけっぱなしではhandmade_marginal_{00|04}.txt に捕まってしまうようだ

書き方を洗練させた結果がたぶんこの提出 #20009989 (kyoshida さん)find メソドと count に加算する前の nilック

 二分探索解法だが探索がループごとに1回の提出 #19993857 (n4o847)

左右の点のうち1点が二分探索で見つかりました左右の点の中間座標は円の中心に由来して明らかです。ではもう1点は? a1 = x*2 - a0

 Integer#sqrtACWA を分けた例

違いは1行だMath.sqrt の結果を(floor ではなく)小数点以下第5位あたりで丸めていたらどちらも ACったんだろうかダメで

これが Integer.sqrt の実装らしい

def isqrt(n):
    x, y = n, (n + 1) // 2
    while y < x:
        x, y = y, (y + n // y) // 2
    return x
提出 #19970166

Math.sqrt とは別に用意する価値があるからこそ存在しているのかなッチとか言ってしまったがこちらが使い所を知らないだけなの

 ABC191 - D - Circle Lattice Points - Senの競技プログラミング備忘録

自分は今回も Sqrt Inequqlity のとき(20200316p01)浮動小数点数を単純に嫌ったり怖がったりして難を逃れたけどこういう風に限界を見極めて対応できるのっこいいよなあ

 空白とスペースについて

B 問題の出力例はスペース区切りだけど問題文A の要素を空白区切りで順に出力せよという表現になっている

ここを参照すれば間違いないという定義があるわけではないけど空白が white spaces の意味ならここに改行もタブも含まれると考えるのが普通(※要注意ワ)自分「スペース(ASCII 0x20)「空白文字を使い分けているしAtCoder にもそのように期待している

というわけでわざわざ .join(' ') はしない>提出 #19962733

ダメです handmade_marginal_{00|04}.txt に捕まってしまうMath.sqrt のアルゴリズムに起因して誤差が蓄積するらしい?


20210203()

最終更: 2021-05-04T20:49+0900

[AtCoder] AtCoder Beginner Contest 190

先週末の ABC例によってお風呂で考えるも頭が爆発して無理だと思われた F 問題がなぜか今日取りかかってみれば解けたので日記にする

 A 問題 Very Very Primitive Game

すごく難しくてっくり 10 分の時間をかけた

 提出 #19784439 (AC / 119 Byte / 63 ms / 14260 KB)

AokiTakahashi の文字列を2回書いているところに余裕のなさが見える間違えるくらいなら全パターンを網羅して並べればいいんですよ(っていることが違う>20201101p01.03)

 B 問題 Magic 3

A 問題より簡単だった条件を満たすものが1つでもあればいいArray#any? メソドの出番です。

 提出 #19786803 (AC / 106 Byte / 68 ms / 14316 KB)

ところで空配列に関して、[].all?true を返し、[].any?false を返す。この違いによってメソドの選択が制限されることがあるかなと一応警戒するんだけど特にそういう違いは生まれないみたいむしろそうならないようにデフト値が選ばれている罠があるとしたらそこではなく穴に落ちるときは all? を選んでも any? を選んでも落ちる

 C 問題 Bowls and Dishes

制約が K に関して全探索しろと言っている

 提出 #19795600 (AC / 276 Byte / 1129 ms / 15200 KB)

Ruby で最も速い提出(492 ms)より倍以上遅いんだけどどういうことなんでしょうね

本当は今日は F 問題をやるつもりはなくてこの C 問題を速くするつもりで取りかかったのだけど優先順位をつけた深さ優先探索でやろうとしてうまくいく見通しが立たなかったのだった

 D 問題 Staircase Sequences

45 分考えた等差数列の和の公式に2種類あることはこのときに確認済みなので(20201101p01.02.01)今回は使いやすい方を選ぶことができた

 提出 #19810009 (AC / 316 Byte / 177 ms / 14400 KB)

珍しく解答の中にコメトがあるのは書いておかないと脳みそからあふれて何度でも最初から考え直しになるからです。紙と鉛筆を用意すべきなんだよなあ

 E 問題 Magical Ornament

本番中は残り時間が 30 分しかなかったので問題文が短い F 問題に先に取りかかっていた同じように考えたかどうかはわからないがE 問題より F 問題の方が多くの人に解かれていたようだ自分はどちらも解けなかった

制約が3重ループを許すと言っている

解答の後半はもう3回目になるあの形実行速度にハンデを背負った Ruby でのタイムの詰め方はこのときに研究し尽くした>E 問題 Traveling Salesman among Aerial Cities

 提出 #19823594 (TLE×1 / 2032 ms)

惜しいとても惜しい時間制限が2秒なのだけど実行を打ち切られたときは 22xx ms というタイムになる32 ms 詰めれば AC になるぞ

 提出 #19825354 (AC / 656 Byte / 1754 ms / 124536 KB)

ッシュ表を使っていたところで配列を使ったら余裕の AC

必然性があってハッシュテーブルを選んでいたわけではなくてHash のデフトプロックありきでスクリトを構成していたから使っていたTLE は邪道の報い

 提出 #19825691 (AC / 690 Byte / 1585 ms / 64636 KB)

実は唯一の TLE は最も重いケースではなかったこの提出では TLEった 21_large.txt のタイムが 135 ms

前半部分で選ばれた魔法石がどうがんばっても連結できないとわかれば後半の3重ループはスキップできるそういうこと

 提出 #19839422 (AC / 834 Byte / 1560 ms / 63468 KB)

前半部分で距離の確定を双方向からやらずに片方向で済ませてみたら平均的には速くなったけど一番遅いケースでは 25 ms しか違わなかった不毛(けがない)

 「研究し尽くした

Integer#timeswhileープにするだけで 200 ms 縮んでやんのそんなに違うの? times はイテレータの中では速い方だと思ったけど

 F 問題 Shift and Inversions

転倒数って固有名詞なのかな公開された PAST の過去問をやったときに見た>20201111p01K 問題それが解いてあった(提出 #18029328)からといって何かが役に立ったということはない残念

最初にk を増やして数列の初項を最後尾に送り込んだときに転倒数がどのように増減するかがわかったわかったからわかったとしかいいようがないこねくっていたら転倒数の増減が簡単な計算で求まることがわかった

それから転倒数の初期値の求め方を考えたBIT で殴るのではない頭のいい方法があるのではないかと考えたが思いつかなかった

 提出 #19905237 (AC / 342 Byte / 789 ms / 48888 KB)

BITす。RubyPython で速い提出も同じだったので転倒数はこう求めるのだ! という頭のいい方法はないのかも

 提出 #19905970 (AC / 293 Byte / 717 ms / 48844 KB)

実は A 数列をスキャンして作成していた配列 I は不要だった

BIT を使って転倒数を求める手順も考え方次第でひと通りではないということト列を必要とする方法よりは必要ない方法をBIT へのお伺い(対数時間)が2回になる方法よりは1回で済む方法を選びたい脳みそはタダだけど計算資源は有限


20210123() [AtCoder] NoSub に関して @evima0 さんのこのツイトがえらいと思う現在の AtCoder ではコンテトで一度も提出しなかったら (できなかった) 不参加扱いですが問題を読み始めた瞬間に参加扱いにすることを検討しているようでNoSub 即不正みたいな論調ばかりで想像力の足りない連中に言いたいNoSub したくてする奴なんざいねーんだよいつだって誰だって全完できるなら全完したいしそうするに決まってんだよA 問題のサンプルを通す解答すら用意できなかったから NoSub になるんだよもちろん戦術的 NoSub の選択肢は知っているでもそれが?■パフーマスの良かった回だけピックアップすることでレイングが上振れするとしてもその範囲は精々色半分程度ではない自分の場合緑が水色にはなるかもしれないでも青パフォ黄パフォなんて見たこともないから粉飾しても青黄の目はない■にもかかわらず NoSub を含む戦術を駆使してレイングを良く見せようとする人間は自分がその程度伸びる未来も描けない終わった人間だと俺は思う何を気にかける必要がある? そんな他人の足なんざどうでも良かろう

最終更: 2021-05-07T14:34+0900

[AtCoder] AtCoder Beginner Contest 189C,E

今日の ABC

 C 問題 Mandarin Orange

制約がよく見かける 10^5 ではなくて 10^4 だから雑なやり方でも通る気がしたんだけどそんな仏心が期待できるはずがなくて時間が厳しいからこそ制約が緩めてあるのだなあRuby では D 問題よりも解かれてないみたい

 提出 #19612283 (AC / 190 Byte / 88 ms / 15720 KB)

AtCoder のことを初めて日記に書いた記念すべきlog[20190907p01] AtCoder Beginner Contest 140 E問題を思い出して書いた

不安だからそのままにしたけど今回は更新と更新のあいだに参照が1回だけだから番兵も1つで足りたと思う(これに対する答え>実のところ + [N, N]+ [-1, -1] は完全なるコピペ。+ [N]+ [-1] ではダメだったものがどうしてこれで正しい答えにつながるのかっぱり理解していない。RU[N]LU[-1] に番兵を1個置くのと2個置くのの違いとは)

 提出 #19649425 (AC / 167 Byte / 68 ms / 15644 KB)

トで配列を比較するのが贅沢で余分な時間を使ってるみたいだったのを修正した88 ms68 ms

多重代入部分を読み解く参考に>20201124p01, 20200428p01.08.01

主流の解き方ではデータを蓄えたり捨てたりしながら数列を前から一度だけスキャンするみたい何を蓄えて何を捨てるんだろうわからないークの情報は残しておいてもしかたないな現在の要素をピークとして左側への広がりが知りたいかなトレドでは広がりに意味がないな

 提出 #19675442 (AC / 201 Byte / 69 ms / 15096 KB)

2 WA のち AC数列を1回通り抜けるだトレドでインデックスを記録しておいて下降局面で幅を確定する

これ8行目の if が常に true でバグってる

 提出 #19679788 (AC / 199 Byte / 66 ms / 14984 KB)

これが(バグ修正済みの)本当の O(N) 解答バグといっても等しい要素が多いときに無駄があるという程度だったみたいだけど

C 問題でこれをイチから考えるのはあまりに酷だけど実は O(N^2) が通る制約だったらしいRuby10 メガや 100 メガが秒未満は無理だと思うけど

 トグラム中の最大長方形の面積を求める

ここで紹介されている方法が O(N)自分の(前2つ)はソトしてるから O(NlogN)

 提出 #19680172 (AC / 297 Byte / 69 ms / 15104 KB)

っきリンクしたのと同じ日記だけどRubyで一番速いのはこれ345msとして参照したのと同じ解法愚直に検索する O(N^2) 解法の改善案として素直に理解しやすいと思う

数列がソト済みであればあるほど改善効果がなくなるのではないかなクイックソトみたい

 提出 #19700600 (corazon さん / AC)
24
25
#ここがよくわからない
#●●●しない限り、次に来る高さと取り出した長方形の最後のインデックスをスタックの中に入れる

わからないのがよくわかる自分が O(N) 解法を書くにあたって 2 WA した原因がここだから

要するに「取り出した長方形」は「次に来る高さよりも高い要素なわけだから次に来る高さの上位互換であるわ「最後の(=最も左の)インデックスを次に来る高さの左方への広がりとして記録している

 E 問題 Rotate and Flip

 提出 #19644038 (TLE×6 / AC×24)

ン変換を検索して見よう見まねで書いた1時間かかったTLEったこれ以上はもう余力も時間もなかった無念


対称移動のための行列は3つの積ではなく2つの積で表現できるしそれも自分で計算して1つにできるでもそれだけでは TLE のままだろうな行列の掛け算をただの配列同士の掛け合わせとして自分で書いてみたりもしたけど7秒が6秒になるだけだった


競技プログラミングをするフレンズ @kyopro_friends Jan 23

アライグE問題は(0,0),(1,0),(0,1)3点だけシミュレーションすれば全部計算できるのだ!

https://nitter.net/kyopro_friends/status/1352976782320824327

なんだって

汎用的に点を動かそうとするのでなく具体的に基底を動かすってことなんかなだけどそのシミュレーションをするのに行列を使ったら元も子もないのでどうするの? 頭が働かないから行列におまかせしていたんだけどどうしたらいいの?

軸に平行な直線で折り返すのはまあできる90度回転は xy を入れ替えたり符号を入れ替えたりでたぶんできる? 個々の点の座標を求めるのは……?

まあTLE 提出を見れば行列って形で式が見えてるんだから計算できないはずがないんだよなあ

 提出 #19690206 (AC / 619 Byte / 1497 ms / 103080 KB)

いや厳しいトがあってもいくつも穴にはまって時間がかかる「まあできるとか言っていた折り返しも実はできなかった


ここでやったことと蟻本に書かれていた(けど解らない)実はm 項間漸化式の n 項目は行列を用いるのではなく各項を初項の線形結合で表して繰り返し二乗法を行うことによりO(m^2log(n)) で計算することも可能です。興味のある人は考えてみるとよいでしょうに関連はありますか?

 @2021-02-06

移動後の点の X 座標ないし Y 座標を求めるのに、a+x*(b-a)+y*(c-a) の式を使うと遅いどうせ同じ数の係数を蓄えておくなら、a+b*x+c*y で答えが求まるような係数を用意したい

でも何を考えて係数を変換していけばいいのかわからない

a,b, c,d, e,f の初期値を 0,0, 1,0, 0,1 として操作1~4でどのようにマッピングしていく

遅い方速い方備考
操作1b,-a, d,-c, f,-eb,-a, d,-c, f,-e同じ
操作2-b,a, -d,c, -f,e-b,a, -d,c, -f,e同じ
操作3p2-a,b, p2-c,d, p2-e,fp2-a,b, -c,d, -e,f 一部 p2 の省略
操作4a,p2-b, c,p2-d, e,p2-fa,p2-b, c,-d, e,-f 一部 p2 の省略
移動後の座標(a+(c-a)*x+(e-a)*y, b+(d-b)*x+(f-b)*y)(a+c*x+e*y, b+d*x+f*y)引き算が不要

遅い方は各操作で余計なことをしていて移動後の座標を求めるときにも余分なことをさせられているそりゃあ遅くなるはずだけど何を念頭に置けば速い方の式が書けるのかわからない

遅い方を書くときは基底となる2つのベトルを定める3点を移動していくつもりで書いていた

速い方でも (a,b) の意味はただの点なのでわかるでも (c,d)(e,f) に何のイメージを割り当てればいいのかわからないそれこそ向きと大きさだけで位置を定めないトルそのもの? そうかもねそうなんですか?


20210117() いつの間にかセンター試験が終わっていたなくなったという意味で終わっていた時代は共通一次……ではなく共通テトらしい

最終更: 2021-03-02T17:55+0900

[AtCoder]diff精進4問

AtCoder Regular Contest 100C 問題 Linear Approximation
提出 #19496296 (AC / 124 Byte / 173 ms / 36900 KB)
トすることに気付けたらあとは基準線をどう上下させるかだ
最初は平均をとって考えていたが中央値だったひとつだけへっこんだ極端な要素に下駄をはかせようとして他のすべてがそろってでっぱったら意味がない+1 するか -1 するか改善する要素が多い方を選び続けるその均衡点
AtCoder Beginner Contest 115D 問題 Christmas
提出 #19497044 (AC / 480 Byte / 63 ms / 14280 KB)
202012月にあった PASTJ 問題 長い長い文字列を思い出した。提出 #19035422
ということはこの問題もクラスも入れ子にしたイスタスも(つまりは再帰関数が?)不要で解けるということなんだけどそれは解らないので答えはプログラムに聞いた
天下一プログラマーコンテ2012 予選CB 問題 ロイヤルトレトフラッシ
提出 #19497447 (AC / 169 Byte / 65 ms / 14320 KB)
これは簡単最大でも50枚ちっとしかないカドなんていかようにも処理できる
Tenka1 Programmer Beginner ContestC 問題 Align
提出 #19498159 (AC / 215 Byte / 182 ms / 16952 KB)
よくわからない雰囲気で答えらしきものを求めた
これを提出するときに1年以上前に D 問題 Crossing に挑戦していたことを知った。提出 #8100494え? さっぱりわからないんだけど当時と同じように1時間ちっと考えてどうにかなる気もしない

20210115()

最終更: 2021-01-16T18:37+0900

[AtCoder]diff精進3問

Coprime はまた解けなかったWA ではなくなったけど TLE が解消しない

AtCoder Grand Contest 023A 問題 Zero-Sum Ranges
提出 #19447872 (AC / 107 Byte / 176 ms / 43452 KB)
以前に一度挑戦して TLE になっている今となってはどうやって TLE を出すのかわからない
半年前(20200615)まで累積和という概念・単語を知らなかったからそれが理由だろうな
AtCoder Beginner Contest 160E 問題 Red and Green Apples
提出 #19448291 (AC / 114 Byte / 192 ms / 42816 KB)
リアルタイムで参加した ABC だけど D 問題で詰まったからこの問題は初見こんなに簡単でいいのだろうXAYB という制約がまた親切で面倒な場合分けを取り除いている
提出 #19457324 (AC / 94 Byte / 242 ms / 41108 KB)
引数付きの max メソドを使うチスだと気がついて再提出してみたら 25 % くらい遅くなった用意された罠なの?
diverta 2019 Programming Contest 2B 問題 Picking Up
提出 #19449145 (AC / 184 Byte / 65 ms / 14404 KB)
2019年と2020年に一度ずつ提出して同じように1つの RE と3つ4つの WA をもらっていたREN=1 のケースWA はたぶん軸に平行な傾きをうまく扱えなかったんだろう今回は読めていた

20210113()

最終更: 2021-05-04T21:04+0900

[AtCoder]diff精進5問(+α)

AtCoder Problems がお勧めする Moderate な問題(difficulty)を上から順に解いた半年前に解けなかった問題も1年前に解けなかった問題も解けただから0完だったこの前の ARC 111 は忘れよう

AtCoder Beginner Contest 178E 問題 Dist Max
提出 #19414840 (AC / 137 Byte / 319 ms / 28476 KB)
わかるようなわからないような感じが今でもするんだけどy=x に沿って対極にある2点とy=-x に沿って対極にある2点を抽出して比較すればいいらしいコンテト後に解いた人の感想が目に入っていたのでチトといえばチ
AtCoder Beginner Contest 152D 問題 Handstand 2
提出 #19421375 (AC / 312 Byte / 63 ms/ 14260 KB)
面倒くさく計算で解いたんだけどN 個の数を列挙して先頭の桁の数字と末尾の桁の数字でクラス分けして数えて掛け合わせるので解けたらしいたぶんそちらの方が間違えない
AtCoder Beginner Contest 114C 問題 755
提出 #19420198 (AC / 210 Byte / 81 ms / 17972 KB)
っきのと似た問題これは計算と列挙のハイブリドで解いたんだけどそうすると速くもなくシンプルでもなくどっちつかずになった
そうすると? これを見よ>提出 #15048046 (jajapop さん)シンプルに列挙して速い
AtCoder Regular Contest 006C 問題 積み重ね
提出 #19420356 (AC / 95 Byte / 69 ms / 14280 KB)
謎の段ボール重さと丈夫さが1つの数字で同時に表されている1の上に2は乗せられないけれど1と1と1を3つ乗せることはできる謎の段ボール
大きさだと考えればいいのかも小が大を支える不安定な重ね方が NG だとでも重さって問題文に書いてあるなあ←どうでもいいから解
最適な置き場所は1つなので貪欲法で
AtCoder Beginner Contest 039D 問題 画像処理高橋君
提出 #19421120 (AC / 242 Byte / 86 ms / 29364 KB)
最近の ABC-D はこういう素直に実装するだけの問題ってなくない? 数学でいじめられたり制約でいじめられたりばっかりじゃない? この問題が今の ABC で出たら difficulty が緑ってことはまずなくて灰茶がいいところだと思う世知辛いなあ

 アナクロニズム

過去問はトケースが利用できるDropBox からダウンロドするとコンテトの各問題ごとに inォルダと outォルダが解凍される

ARC111_Aォルダの中がこうなっているとする

  • in/
  • out/
  • my_answer.rb

そこで次のように実行する(ARC111_A> はプロン)

ARC111_A> attc my_answer.rb

attc.bat の中身がこう

@echo off
for %%F in ("in\*") do (
	call :run "%~1" "%%~F"
)
exit /b 0

:run
	echo %~1 ^< in\%~nx2
	call ruby27 "%~1" < "in\%~nx2" > "out\%~n1.out.txt"
	fc /A "out\%~n1.out.txt" "out\%~nx2"
	del "out\%~n1.out.txt"
	echo.
exit /b 0

カレトリの inォルダの中身を入力として引数のスクリトを ruby27 コマドで実行する出力を outォルダの同名のファイルと fc コマドで比較する

call ruby27 という風に call が付いてるのは ruby27exe の名前ではなくてC:\Program Files\Ruby27\binPATH を通してから ruby.exe を呼び出すバッチファイルの名前だという固有の事情から

別に call でなくて当たり障りのないコマドならたぶん何でもいいんだけど、call|ruby27 という風にパイプを通すと新しいコマドインタープリタが起動するので呼び出したバッチが setlocal してなかったとしても現在の環境(PATH 変数とかカレトリとか)が汚染されなくなるというハックがある。cmd /C "ruby27 ..." と同じことなんだろうけどっちは引数が引数になって二重の引用符が面倒の種だよね

tcTest Case の略だけど AtCoder の略が atac かで定まらないからattcactc の両方の名前でバッチを用意してるドリンクにしたら中身の同期に手間もかからないし

アナクロだけどそれなりに便利


20210103()

最終更: 2021-01-03T19:49+0900

[AtCoder] AtCoder Beginner Contest 187E 問題 Through Path

PAST 第4回の M 問題 筆塗りを思い出したよね>20201111p01.01

制約が 10^5 の組み合わせだというところが同じだから何について繰り返すかというところが核心繰り返しの繰り返しは許されないN-1 本の辺を順序よく1往復か2往復すれば答えが出そうな気がするんだけど全然ループの軸が見えなかったまだ見えていないーにキーに突っ込んで処理できる順に処理しても間に合うかと考えてみたけどメモするデータが定まらなくて完成しないこういうところだよこういうところが緑色で燻っている理由だよ


20201222()

最終更: 2020-12-23T00:48+0900

[AtCoder] パナソニックプログラミングコンテAtCoder Beginner Contest 186E 問題 Throne

まだ AC をもらっていないしそれどころかひとつの提出もできていないけど外堀が埋まってきた気がするので経過を書く

 シミュレーションした(未提)

gets
puts$<.map{|ln|
	n,s,k = ln.split.map(&:to_i)
	ss = {0=>m=0}
	until ss[s]
		ss[s] = s
		m -= (s-n)/k
		s += (s-n)/k*-k
		s %= n
	end
	next s == 0 ? m : -1
}

これはサンプルの4つのケースのうち3番目を除いて正しい答えを出す。3番目の 998244353 897581057 595591169 にもたぶん正しい答えを返すだろうけど答えがおよそ 250 メガなので数分単位の時間がかかるはず。

NSK の3つの数字があるけどNK が近接していてしかもべらぼうに値が大きいープ1回のイテレーションで全周 N のうち1点だけをテトするのでは最悪 N 回繰り返す。N の上限は1ギガだ

 たとえば K = N-1 の場合

1回のイテレーションで S-1 の地点に移動するS 回のイテレーションで玉座に移動することが即座に理解できるがスクリトにそれは反映されていない

 たとえば NK が偶数で S が奇数の場合

K が2より大きければ(N との関係にもよるが)すべての偶数地点を網羅できるとは限らないがK が最小の偶数2であってもスタト地点 S から奇数席離れた玉座に移動できないことはすぐにわかるこれもスクリトに反映されていない

 それで?

NKS の関係をどういう式で表すのかなあLCM だか GCD だかのキーワドは目に入ってるんだけど


K = N%K という風に再帰的に K を更新していくと最後は 0 に落ち着くK0 になるまでに S をどうにかしたものが K で割り切れれば答えは N/K の倍数±α になりそうなんだけどS をどうするのかN-S をどうにかするのかよくわからない