最終更新: 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 をどうにかするのか、よくわからない。
最終更新: 2020-12-08T16:28+0900
ARC 級の企業コンであることがわかりやすい表記にな
鹿島の名前はブル
題意を満たすような数のうち脳死で求められるものはすべての数の積+1なんだけど、答えに制約があ
2 から N の数を素因数分解してマ
ひ
入力例1の解説を注意深く読めばわかるはずですが、注意すべき点があります。110 を 100 個連結した文字列の中に、110110 という部分文字列は 99 個見つけることができます。決して 50 個ではありません。
この勘違いを正すのに多大な時間を要した。難しい問題ではないとわかるのに答えが全然合わなくて、神経衰弱になりそうだ
とりあえず答えは出た。
前回より悪くて(20201202p01.04)、3問目にして 20 分しか時間が残
TLE です。メモリの使用量に比例した時間がかか
特に頭の悪いことをしている部分があるとは思わないんだけど、だからこそ、根本から発想の転換が必要だと言われたら困るなあ。
大量のメモリ同じ操作を要求する3つ目の数があれば、それも即 NG。
」とか、今考えたけど「i,i+1 という操作と i+1,i という操作を要求する2数があれば、操作列のマ
前半部分の列挙について考えていると、後半部分のキ
つまり、数列に対応した(※)配列に右向き左向きをメモして、山と谷があ
※数に対応させるのか数と数の間に対応させるのかで迷
とりとめなくいろいろ書いたけど、結局、前半部で見え見えのダメケ
も
最終更新: 2020-12-03T19:37+0900
先月28日土曜日の振り返り。ARC なので A 問題が 300 点からスタ
時間は長めの2時間。ABC と違
上の階に上がるのに階段と廊下の2種類の手段があるというのが不思議な設定だが、床の高さが半階分ずれた2棟が上りと下りのスロ
11分ち
考えたこと。
節約する本数 k から n (の下限)を求める式が n ≧ Σ(k+1) = k+k*(k+1)/2
だということはすぐにわか
n の制約上限は 10^{18} であり、(10**18).bit_length は 60。なんだ探索すればいいじ
RPS
k の上限は高々 100 ではあるけれど、2^k 通りの勝敗を考えるには大きすぎる数だ。まあ頭の中で考える分にはあまり関係がないので、ト
最初の提出まで 30 分。C 問題という段階で解けなくてもともとなので、あせる理由はどこにもない。
残り時間は 30 分だ
四角形の座標移動をまず考えた。
ここまで考えたが、この安定した移動に入る前と出るときに何手かかるのか数え切れなか
というわけで D 問題はひとつの提出も用意できないまま放置している。
あ、3通りじ
え? 7通りある? だから最初から最後まで機械に数えさせるべきなんだな。
最終更新: 2021-05-07T14:51+0900
超竜馬の移動ル
これ以上ない可読性を誉めてほしい。可読性とはこういうことだ。(他人が言う、ただの手癖レベルの)可読性なんぞいらない(どうして自分が書いたコ
先の AC 提出と全く同じ内容だが after_contest_01.txt という入力だけ WA にな
after_contest_01.txt を通して本当の AC。可読性は維持している。
もちろん誇大表現は話半分に受け取らなければいけない。数学の言葉が通じない人向けに日本語で移動ル
異なる可読性もあると思う。読者を惑わせる無駄や回り道、曖昧さがなく目的に直結する、論理的で考え抜かれたシンプルなコ
期待値? 定義しかわかりません。試行回数が不定? 一瞬で放り投げかけたが踏みとどま
A, B, C 3つも変数があると頭がパニA*10000+B*100+C
と1変数にエンコ
ただし += とすべき確率を = で上書きしていたためになぜかサンプル4だけ答えが合わなか
同じ Ruby で 300 ms 台の提出があるのと比べると 867 ms はかなり遅い。しかしもう考えたくない。
10分しか残
TLE はいいけど WA はいただけない。今日は寝る。
はい、やるだけでした(だがそれができなか
WA の原因は再訪防止のマ
30% あまり速くな
再訪防止フラグ(配列 T)のインデ
問題として与えられるグリ
訪れるべき所を訪れ損な
テレポ/[Sa-z]/
から /[a-z]+/
にした。
S の有無は関係なくて、連続するテレポ
String#each_char で1文字ずつ文字種をテストするのにくらべて正規表現という仰々しい道具を持ち出した String#index が有利になる条件は、テレポ
逆に言えば、テレポ
index メソ
使用済みのテレポ
インクル
もう 20 % ほど速くな
それから、1つだけの WA の原因はよくわからなくな
最終更新: 2020-11-22T08:26+0900
コンテスト中に問題文は理解していたと思う。文は。問題まで理解していたかは知らない。
これを DFS で探索しようとした。だめな選択に早々に見切りをつけて手戻りを減らすために、選択肢の少ない頂点に優先して選ばせようとした。
あとで提出して確かめる。TLE になるならさらに考えないといけない。WA になるなら問題文を読み直さないといけない。
あ、選ばなくていい頂点もあるのか。木の根に相当する頂点。選ばれる辺の数は N-1 以上になるから必ずなにがしかの木+余分な辺になるわけだけど、それがどういう意味を持つのか。最後の頂点だけ選べなくてもいい
最終更新: 2021-02-20T23:02+0900
今回は K 問題までたどり着けなくて、J 問題で詰ま
その後 K 問題は解けたし、なんなら L 問題も解けたけど、時間はかけた。そして M 問題。
まだ3つの TLE に阻まれている。
何について繰り返すか、その通りがかりに素早く答えを出すためにどんな最適化されたデ
実行時間の制限が長めの4秒ではあるけど、制約上の上限がどれもこれも 10^5 だから、何かについて繰り返しているあいだに探索やら配列埋めやら時間がかかる処理をするわけにはいかない。
たとえばクエリごとに色記録配列を埋めるとか、辺(=頂点集合を左右に分ける)ごとに関与するクエリを逆順に検索するとかは間に合わない。Ruby では間違いなく。
Array にはない ^ メソ
3つの演算子(+, -, &)を使
bsearch_index と concat で Array#^ メソ
N 個のノ
「打開するヒントが見えない。どういう形の木なのか」と書いたけど、直線の反対ということで子供が 100, 1000 あるような木を用意したらてきめんに遅くな
変更点はソ
4400 ms が 4200 ms にな
あるノ
※ z-order が大きければ他の色より前に出られる。LCA が小さければ前にある色が LCA に到達して退場するのを待てる。どちらでもなければ前に出る前に退場させられる。
や
LCA が正解だ
うれしい。と
ところで PyPy3 のこのシンプルかつ Python 系で一番速い提出 #18047488 (819 ms) はなんの魔法だろう。半分以上が入力の処理で、残りでヒ
JIT で速いから余計な手をかけないで済むということなら Ruby には関係のないことだけど、考察が足りていなくて自分のアルゴリズムがヘボだというなら、学ばなければいけない。
それはそれとして、LCAの確定を待つ色のリストはソ
初めて Crystal を書いた。色々言いたい。
delete_if と inject メソ
inject は配列の各要素のあいだに演算子を挿入するイメ
lambda メソ-> () {}
と書いた。アロ
パラメ)
を所望する」と怒られ、素直に )
を書いたら型注釈を付けろと怒られる無限ル
後付けするなら記号は選ばなければいけない。Ruby の仕様(メソ
_
が使えない。なぜ?定数と変数が同じスコ
n,q = gets.split.map(&.to_i) N = n; Q = q
これは変数 n が定義されていないというエラ
(追記:下の方で答えを書いてたかも。「map が遅延評価? .to_a を付けないと期待したタイミングで副作用が起こらない。
」 map が遅延評価であることと代入が行われないことは別だと思うのだが違うのか。違う(別ではない)なら大変に興味深い Crystal の特徴だと思う)
&:to_i
と書いていたものを &.to_i
と書かせる。
.to_i
が Crystal という言語を構成する部分として定義されており、プログラマが操作可能な対象であるなら評価は変わるけど、単に &
という目印のバリエ&.
を追加したなら、ただの好き嫌いでただの罠。
{|i,|}
とか {|i,j|}
とかできない雰囲気。それとも StaticArray だmap.with_index
と書くと map にブロnil が非常に煩わしい。Ruby はすべての変数が Nullable だし、偽と評価される値が nil と false だけなのもあgets.to_i
とは書けなくて gets.to_s.to_i
と書かされるところ。たぶん (gets||"").to_i
でもいいとは思う。
実行時エラ
&.
によるメソ
[]
とか {}
とか書けない。とりあえず領域を確保するために [nil]*N
と書くのもタイプミスマすべてドキ
俺は人類の手には多少余るとしても、プログラマを信頼し、力を与えてくれる言語が好きだ。安全のためと称して枷をはめようとする言語は選ばない。安全な
では Ruby の切れ味は? Ruby はプログラマがやりたいことの邪魔をしないのがいい。Ruby がコ
Crystal の型はどうか。プログラマに力を与えるためではなく、処理系が力を得るためにプログラマが受け入れる枷だというのが、少し触
const 教の信者というのは最も“const と書きたくない”人種のことだと自認している。const という当たり前のことを、どうしてあちこちそちこちに書いて回らなければいけないのか。所有権も魅力的だけど、const と書かなくてもいいという1点でまず、Rust の評価が高い。
C++ も Ruby も好きだけど弱点がある。Rust には期待ができる。でもコンパイラが起動できないんだよなあ。「rustc.exe - エントリ ポイントが見つかりません。プロシ
」 本でも読むか。
#18069462 と比べて、-1016 Byte / -313 ms / -33108 KB
。短くて速くて省メモリ。
先に書いたように、「クエリごとに色記録配列を埋めるとか、辺(=頂点集合を左右に分ける)ごとに関与するクエリを逆順に検索するとかは間に合わない」のはたぶん間違いないけども、2つを混ぜてクエリの逆順に効率良く色記録配列を埋めるところまでは考えが及んでいなか
時間軸を反転することで、一度塗
PAST4M - 西尾泰和のScrapboxったところを再度塗らないでスキ ップしたい
その方針でや
最終更新: 2021-05-07T15:06+0900
DP の基本形とい
実行時間の変遷が見どころ。
N×K×W のル
N のル
提出一覧が 1000 ms を超えるグル
B の値域が(W にくらべて)かなり狭い範囲に限定されているのがポイントで、速い方はル
2番手以降の集団をダブルスコアで突き放す zazaboon さんの提出 #11417636 (150 ms) を調べた結果。
以上の点を真似したのに加えて、考えられるこちらのアドバンテ
a = [a,b].min
と書くより a = b if b < a
と書いて代入を省略できる方が速い。(だけど本当は宣言的な変数定義がしたい。操作ではなく結果について書きたい)前後のリストを比べると後ろは問題と関係のない比較的どうでもいい内容が並んでいるね。
いまのところの Python 最速。AB 配列を幅対重要度比でソ
使う使わないの二択だと比率がち
最近別の問題を自分が DFS で解いたときのことだけど、「さ