最終更新: 2021-03-24T16:47+0900
解いたあとで他の人の Ruby での解答を見たらバリエ
これが一番多か
これは Ruby で最速の qib さんの提出 #20369253 (191 ms) の解法。
公式解説にはこう書かれている。
マス i と j の距離を d(i,j) として,マス i の色は d(1,i) ≦ d(N,i) ならば黒,そうでなければ白となる.結論としてマス 1 とマス N の 2 点から幅優先探索や深さ優先探索などを行うことで O(N) でこの問題を解くことが可能である.
解法1はたしかに解説通りの手順ではあるが、解答にあたり具体的な距離まで知りたいわけではなく、距離の大小関係だけ知れれば十分なのだ。
解法2の手順は(スタマス i の色は d(1,i) ≦ d(N,i) ならば黒,そうでなければ白となる
」が納得できるかどうかに尽きるのだけど、解法2の手順がなまじゲ
フ
フ
結局のところこの問題は一本の辺を見つけ出す問題だ
その手順として幅優先探索(解法1)とその応用(解法2)と深さ優先探索(解法3)とダイクストラ法(未紹介)と、いろいろな方法があ
今日@2021-03-23 たまたま取り組んだこの問題が同じ方針で解けそうだ
2地点から深さ優先探索で陣取りをしてい
き
競技プログラミングをするフレンズ @kyopro_friends
サ
Twitterーバル「ABC148F『Playing tag on tree』にafter_contestを追加したよ! 不等式に等号を入れるか入れないかを間違 ってるコ ードが落ちるようにな ったはずだから確認してみてね」https://t.co/jcHP4lHFhg
不等号などなか
当初方針のまま after_contest に対応したが、どうにも不自然に頑張
ところで ABC148 はオンタイムで参加していた。A-D まで灰 diff で、E 問題に至
木の上で追いかけなお、ゲ
」 そんなん考えたら青 diff 上位の「DFS Game」より難しくなる
最終更新: 2021-03-15T22:56+0900
本日の ABC。1時間かけて ABCD の4完で、残り40分考えて E 問題が解けずに終わ
本番中に E 問題が行き詰ま
割と大きめのサンプル3が通
考えたことを順番に。
このとき(緑diff精進3問)解いた問題の1つが「ABC 115 D - Christmas」なんだけど、素直に問題の通りに書いた最初の版が明らかに TLE を免れなくて、ださいけど if を使
倍倍ゲ
たぶんグル
組み合わせた結果をフ
全探索がダメでもある種の探索が許されていたあたり、今日の制約には優しさが感じられるなあ。
これに関連した @kyopro_friends さんのツイ
競技プログラミングをするフレンズ @kyopro_friends
アライグマ「F問題は、COLOCON2018C『すぬけそだて――ごはん――』の難しい版なのだ! gcd(x,y)=gcd(x-y,y)≦|x-y|だから、72以下の素数の倍数が重複しないようにすればよくて、どの素数の倍数をもう使
TwitterったかでbitDPすればいいのだ!」
「
」gcd(x,y)=gcd(x-y,y)≦|x-y|
というような発見があ
最終更新: 2021-03-23T20:00+0900
解説を読んで ABC をコンプリ
2回目があるかはわからない。1回目にして解説を読んでから2日間苦しんだ。DP だ
ソ
dp[i][j][k] = i 番目までから j 個選んだときの和であ
https://atcoder.jp/contests/abc192/editorial/705って、mod C で k に等しいようなものの最大値
自分は最初これを次のように解釈した。
dp[i][j][k] = i 番目までから j 個選んだときの和であ
って、mod j で k に等しいようなものの最大値
微妙な違いがわかりますか? mod C と mod j の違い。う
引き回すデ
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
要するに、これを時間制限に収まるように書き直しまし
結局一度完成したと思
DP であることでナイ
j+1 個の組み合わせを生成するのに j 個の組み合わせ結果が利用できる。
その際にキi 番目までから j 個選んだときの和であ
」)。j 個の組み合わせ結果を i (1~N-j)によ
たぶんこれ
見つけた遷移は具体的には、「j を C まで増やしながら、ある j について i 番目の要素(A[i])を i の大きい順に考える。A[i] を採用しないときに dp[j][i] に対応する C 要素の配列は dp[j][i+1] のものと同じ。A[i] を採用するときは dp[j-1][i+1] に記録された C 個の値と組み合わせる」 i と j が解説とは入れ替わ
dp[j][i] の値を作るのに dp[j][i+1] (最内ル
勘違いして見えていなか
提出 #20486969 (TLE×11)
主にイテレ
Array#min の代わりに Array#[] でダイレクトに最小値を取得するようにしたので、special_xx.txt 以外のケ
提出 #20486969 (TLE×11)
同じように Array#min を使うのをやめたのと、イテレ
Ruby
でもどこに 800 ms も遅くなる要因があ
平均すると最初の提出より1割弱タイムが改善しているけど、意味のある差ではない。
ベ
AC と TLE の分かれ目は4重ル
初期値を正の無限大ではなく nil にした。
正の無限大は正常値として扱えるので記述が統一できるのだけど、むしろ異常値として nil や -1 や無限大を設定・検知して、ル
ところで、想定上限を整数で表現しようとすると 67 か 68 ビ
k = m%c
や k-=c if c<=k
よりも、「実行されないコいくつかの C について最小公倍数で余りをとれば、より外側のル
「いくつかの C について最小公倍数で余りをとれば、より外側のルj=C/2; i=0
の DP 配列を C=C/2 の DP 配列として再利用した。
たとえば N が上限の 100 のとき、51..100 は普通に DP をする。1..50 は再利用配列を使用して DP をしない。限界は次の2点。
ケ | X | X (素因数) | A に含まれる 9999999 の数 | 答えが見つかる C |
---|---|---|---|---|
special_01.txt | 52142908377193267 | 103×4703×107642319563 | 0 | 1 |
special_02.txt | 48620189947792921 | 131×2719×18713×7294453 | 1 | 2 |
special_03.txt | 702276810747319237 | 702276810747319237 | 2 | 3 |
special_04.txt | 651020109319638361 | 162011×231599×17350549 | 3 | 4 |
special_05.txt | 611688502818504841 | 82936769××7375359689 | 4 | 5 |
special_06.txt | 85741517196073082 | 2×11257×32587×116867599 | 5 | 6 |
special_07.txt | 794433313787770441 | 101×74910361×105001181 | 6 | 7 |
special_08.txt | 515779426304609041 | 101×5106726993114941 | 7 | 8 |
special_09.txt | 896297933758956951 | 3×22769×13121611749293 | 8 | 9 |
special_10.txt | 90842952249996662 | 2×24335153×1866496427 | 9 | 10 |
N はすべて 100。数列 A の要素はほとんどが 10000000 で、0から9個が 9999999 という構成。
special_xx.txt が入力する数列 A の中に値の種類は1から2個しかなか
最終更新: 2021-04-06T17:58+0900
昨日あ
正規表現を乱用する問題だと決めつけて考えた。使える限り最善でなくてもかえ
パタ/^([a-z][A-Z\n])+$/
で良か
$ は改行の前でも文字列の末尾でもマ
入力が英大文字小文字だけだから大小の判別は1ビ
C 問題にしては……と疑いをも
最近誰かがツイ
や
あれ? やるだけ? という感想はあまりに素直。たしかに優秀な人は目をつぶ
それは1の位についてだけ当てはまらない。基数が3でも4でも5でも、数1は0より大きい1番目の数で変わらない。
そしてこれが、基数の種類を答える問題でないことの傍証になる(そういう誤読が多か
二分探索の下限に d+1 を、上限に M+1 を設定していたのだけど、M+1 の方が d+1 より小さいことがあるから、答えを導く引き算の結果が負の数になるケ
手で計算しているときは自然と自然数の範囲でものごとを考えてしま
早期に AC を得ていた複数の人が上限を定めない二分探索を行
7 WA のあとの AC。どちらの落とし穴もテキト
えびま @evima0
(D 実はもともと「9 1」
Twitterっていうサンプルがあ ったんですが、出題の意義が 1/3 くらい消滅する (「1 9」だと 2/3 消滅) ので消してもらいました) https://t.co/NNcbAu6GjF
このツイ
自分より上位の人は仮に D 問題の罠にはま
競技プログラミングをするフレンズ @kyopro_friends
フ
Twitterェネ ック「もともとD問題でXが1文字のケ ースを、アライさんは2個か3個しか用意してなくて、それだとWAのケ ース数でコ ーナ ーケ ースがバレそうだからたくさん増やすようにアドバイスしてみたんだけど、どうだ ったかな?」https://t.co/FxcvbhUJNL
AC が出るまでは WA の数を見て方針を疑
プライオリテ
……だと思
あと、久しぶりにプライオリテ
最終更新: 2021-05-07T14:00+0900
先週末の ARC。ABの2完でレ
一応制約は掛け算していたんだけど、まずは素直に数えて確実に答えを……TLE。見れば一次 の k のΣなので機械的に変形して……AC。
間違
どれだけ1円を払
2 WA のあとの AC。±B と 0 と、それらで区切られた4つの区間を愚直に数えた。
翌日にな
問題の見通しは難しくない。表のスコアと裏のスコアと、手番を渡すか否かのフラグ(子孫ノ
制約の 1≤<v
の解釈に一瞬詰ま
最後まで解らなか
odd.sort_by!{ _2-_1 }
と even.each(...)
がキモ。これが二人の戦術。
最後まで見えなか
even は潜
裏のスコアの方が高いものは、できることなら相手の手番で相手に選ばせたい。そうすれば表のスコア(低い)が相手のものに、裏のスコア(高い)が自分のものになる。それが可能になるのは、潜
Ruby の他の AC 提出(今のところ2つ)と比べて遅か
ところで、再帰呼び出しを行stack level too deep (SystemStackError)
が出て速度比較ができなか
最終更新: 2021-05-07T14:21+0900
今日の ABC の C と D はち
どこに着目すれば数えられるのか、わかりますか? わかりません。
テキト
(構造の)理解に頭が必要ないという意味で、これも可読性に優れた読みやすいソ
だけどプログラムは構造化と抽象化を(必要である限り)繰り返して、人間はよりハイレベルな意味を読み取らなければいけないんです。あれをど
これ白に塗られた任意の 2 マスは、辺を共有するマスへの移動を繰り返し、白に塗られたマスのみを通
」ともあるし、問題文は慎重に
書かれていたと思う。
多角形の解釈についても、色が塗られたグリ
数学の言葉で書かれた制約の読解に普段苦労するので(20201122p01)、今回の問題文に文句はない。
すごくいい。そうか、ド
図形です。
制約が 10^5 だからどうかな
1時間かけて、コンテスト終了1分前の提出。よか
格子点を数える問題で、入力を小数で受け取るのはや
# 0 を足すと答えが変わります。難しすぎるでしょ? -1/2 #=> -1 0-1/2 #=> 0 # 1 (イチ)が変数 l (エル)で、中身が正の数だったり負の数だったりすると、もう予測できないでしょ?
上記は Ruby の挙動。仲間はずれらしい>「整数同士の除算演算子の挙動 (C言語、C++、Scala、Java、Rust、Go言語、PHP、JavaScript、Perl、Python、Ruby、Elixir) - Qiita」 Python の整数除算(//
)も同じく負の無限大方向に丸められるとか。
他の人の Ruby での提出を見ると、入力を to_r するものが多か
二分探索の探索範囲をちまちま限定したところで、倍の違いが試行1回の違いにしかならないのだから、2つのル
競技プログラミングをするフレンズ @kyopro_friends
アライグマ「D問題は、円の中の格子点のx座標としてありえる値の範囲がX-R~X+Rだから、x座標を決めたときの格子点の個数が求められればいいのだ! 誤差が大変だから整数で計算して、負の数の切り上げや切り捨ての計算に気をつけて……、罠がい
https://twitter.com/kyopro_friends/status/1358048807145992193っぱいあ って大変なのだ」https://t.co/6z8erFU3Ym
実は二分探索がいらなか
三平方の定理。速い! 短い!
Integer#sqrt なんてニ
ところで、や**2
は遅いみたい。引き算を2回評価することにな
Ruby での提出を早い順に見てるんだけど、どの人もどの人も平方根をと
Rational だけでなく BigDecimal の存在も忘れていた。これは「任意の精度で 10 進表現された浮動小数点数を扱えます。
」 to_d の d は (big)decimal の d. to_f を to_d にしてもや
提出して確かめようとしてわか
入力は Rational で受け取
単純に±1するだけ、し
書き方を洗練させた結果がたぶんこの提出 #20009989 (kyoshida さん)。find メソ
左右の点のうち1点が二分探索で見つかりました。左右の点の中間座標は円の中心に由来して明らかです。ではもう1点は? a1 = x*2 - a0
違いは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 とは別に用意する価値があるからこそ存在しているのかな。ニ
自分は今回も Sqrt Inequqlity のとき(20200316p01)も、浮動小数点数を単純に嫌
B 問題の出力例はスペA′ の要素を空白区切りで順に出力せよ。
」という表現にな
ここを参照すれば間違いないという定義があるわけではないけど、空白が white spaces の意味なら、ここに改行もタブも含まれると考えるのが普通(※要注意ワ
というわけで、わざわざ .join(' ')
はしない>提出 #19962733。
ダメです handmade_marginal_{00|04}.txt に捕ま
最終更新: 2021-05-04T20:49+0900
先週末の ABC。例によ
すごく難しくて、じ
Aoki と Takahashi の文字列を2回書いているところに余裕のなさが見える。間違えるくらいなら全パタ
A 問題より簡単だ
ところで空配列に関して、[].all?
は true を返し、[].any?
は false を返す。この違いによ
制約が K に関して全探索しろと言
Ruby で最も速い提出(492 ms)より倍以上遅いんだけど、どういうことなんでし
本当は今日は F 問題をやるつもりはなくて、この C 問題を速くするつもりで取りかか
45 分考えた。等差数列の和の公式に2種類あることはこのときに確認済みなので(20201101p01.02.01)、今回は使いやすい方を選ぶことができた。
珍しく解答の中にコメントがあるのは、書いておかないと脳みそからあふれて何度でも最初から考え直しになるからです。紙と鉛筆を用意すべきなんだよなあ。
本番中は残り時間が 30 分しかなか
制約が3重ル
解答の後半はもう3回目になるあの形。実行速度にハンデを背負
惜しい。とても惜しい。時間制限が2秒なのだけど、実行を打ち切られたときは 22xx ms というタイムになる。32 ms 詰めれば AC になるぞ。
ハ
必然性があ
実は唯一の TLE は最も重いケ
前半部分で選ばれた魔法石がどうがんば
前半部分で距離の確定を双方向からやらずに片方向で済ませてみたら、平均的には速くな
Integer#times を while ル
転倒数
最初に、k を増やして数列の初項を最後尾に送り込んだときに、転倒数がどのように増減するかがわか
それから、転倒数の初期値の求め方を考えた。BIT で殴るのではない、頭のいい方法があるのではないかと考えたが、思いつかなか
BIT です。Ruby や Python で速い提出も同じだ
実は A 数列をスキ
BIT を使
最終更新: 2021-05-07T14:34+0900
今日の ABC。
制約がよく見かける 10^5 ではなくて 10^4 だから雑なやり方でも通る気がしたんだけど、そんな仏心が期待できるはずがなくて、時間が厳しいからこそ制約が緩めてあるのだなあ。Ruby では D 問題よりも解かれてないみたい。
AtCoder のことを初めて日記に書いた記念すべき日「脳log[20190907p01] AtCoder Beginner Contest 140 E問題」を思い出して書いた。
不安だからそのままにしたけど、今回は更新と更新のあいだに参照が1回だけだから、番兵も1つで足りたと思う(これに対する答え>「実のところ
」)。+ [N, N]
と + [-1, -1]
は完全なるコピペ。+ [N]
と + [-1]
ではダメだRU[N]
と LU[-1]
に番兵を1個置くのと2個置くのの違いとは。
ソ
多重代入部分を読み解く参考に>20201124p01, 20200428p01.08.01
主流の解き方ではデ
2 WA のち AC。数列を1回通り抜けるだけ。上昇トレンドでインデ
あ、これ8行目の if が常に true でバグ
これが(バグ修正済みの)本当の O(N) 解答。バグとい
C 問題でこれをイチから考えるのはあまりに酷だけど、実は O(N^2) が通る制約だ
ここで紹介されている方法が O(N)。自分の(前2つ)はソ
さ
数列がソ
24 25 #ここがよくわからない #●●●しない限り、次に来る高さと取り出した長方形の最後のインデックスをスタックの中に入れる
わからないのがよくわかる。自分が O(N) 解法を書くにあた
要するに、「取り出した長方形」は「次に来る高さ」よりも高い要素なわけだから、次に来る高さの上位互換であるわけ。その「最後の」(=最も左の)インデ
アフ
対称移動のための行列は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度回転は x と y を入れ替えたり符号を入れ替えたりで、たぶんできる? 個々の点の座標を求めるのは……?
まあ、TLE 提出を見れば行列
いや
ここでや
移動後の点の 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でどのようにマ
遅い方 | 速い方 | 備考 | |
---|---|---|---|
操作1 | b,-a, d,-c, f,-e | b,-a, d,-c, f,-e | 同じ |
操作2 | -b,a, -d,c, -f,e | -b,a, -d,c, -f,e | 同じ |
操作3 | p2-a,b, p2-c,d, p2-e,f | p2-a,b, -c,d, -e,f | 一部 p2 の省略 |
操作4 | a,p2-b, c,p2-d, e,p2-f | a,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) に何のイメ
最終更新: 2021-03-02T17:55+0900
最終更新: 2021-01-16T18:37+0900
Coprime はまた解けなか
最終更新: 2021-05-04T21:04+0900
AtCoder Problems がお勧めする Moderate な問題(緑difficulty)を上から順に解いた。半年前に解けなか
過去問はテストケ
ARC111_A フ
そこで次のように実行する。(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
カレントデ
call ruby27
という風に call が付いてるのは ruby27 が exe の名前ではなくて、C:\Program Files\Ruby27\bin に PATH を通してから ruby.exe を呼び出すバ
別に call でなくて当たり障りのないコマンドならたぶん何でもいいんだけど、call|ruby27
という風にパイプを通すと新しいコマンドインタcmd /C "ruby27 ..."
と同じことなんだろうけど、そ
tc は Test Case の略だけど、 AtCoder の略が at か ac かで定まらないから、attc と actc の両方の名前でバ
アナクロだけどそれなりに便利。
最終更新: 2021-01-03T19:49+0900
PAST 第4回の M 問題 筆塗りを思い出したよね>20201111p01.01。
制約が 10^5 の組み合わせだというところが同じ。だから何について繰り返すかというところが核心。繰り返しの繰り返しは許されない。N-1 本の辺を順序よく1往復か2往復すれば答えが出そうな気がするんだけど、全然ル
最終更新: 2020-12-23T00:48+0900
まだ 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つのケ998244353 897581057 595591169
にもたぶん正しい答えを返すだろうけど、答えがおよそ 250 メガなので数分単位の時間がかかるはず。
N と S と K の3つの数字があるけど、N と K が近接していてしかもべらぼうに値が大きい。ル
1回のイテレ
K が2より大きければ(N との関係にもよるが)すべての偶数地点を網羅できるとは限らないが、K が最小の偶数2であ
N と K と S の関係をどういう式で表すのかなあ。LCM だか GCD だかのキ
K = N%K という風に再帰的に K を更新していくと最後は 0 に落ち着く。K が 0 になるまでに S をどうにかしたものが K で割り切れれば答えは N/K の倍数±α になりそうなんだけど、S をどうするのか、N-S をどうにかするのか、よくわからない。