if k==2
が最後の TLE 対策。それも含めて思いつきを全部試してみましたみたいな頭悪そうな雰囲気が気に入if k==2
の中身は Pairs と Handshake の解答のオ.tr.to_i+.tr.to_i
(@2021-06-28 .to_i
一発(相当)で計算できるこんな言語もあるらしい。「2001を2進数で解釈するというのは通常だと意味が通らないが、dcにおいては構わず2×2^3が使われる」)C if A && B
が多少冗長ではあるがコストの順に並んでいて総合的には得するだとか(少なくともロ最終更新: 2021-06-17T19:54+0900
「実装したことはないけどダブリング(要は繰り返し二乗法でし
この問題がどうして、選ばれた複数の頂点を決ま
LCA の取り扱いは「巨大企業」や「筆塗り」で経験があるけど、線形より効率的な LCA の検索が案外面倒くさい。「最小共通祖先 [いかたこのたこつぼ]」にいくつか手法がリストア
そこでダブリングです。
間違えた(TLE)。
21 22 23 24 25 26 27 28 29 30 31 32 33 34 | A = [ps=P.dup] (D.max-1).bit_length.times{ # 1世代上はすでに P としてあるので、1回分繰り返しが無駄かも。 A << ps = N1.times.map{|a| ps[ps[a]] } } Ans = lambda{|a,dd| i = 0 while 0<dd a = A[i][a] if 0<dd&1 dd >>= 1 i += 1 end next a } |
A 配列に事前に親、親の親(2世代上)、4世代上、8世代上、とメモしておいて、Ans 関数(Ancestors の略
35 36 37 38 39 40 41 | Dst = lambda{|(a,b)| da,db = D[a],D[b] dc = (1..[da,db].min).bsearch{|dc| Ans[a,da-dc] != Ans[b,db-dc] } next dc ? da-dc+db-dc+2 : (da-db).abs } |
競プロにおいては対数は定数と言われるけれど、かなり大きな定数ではあり、必要がないところで log をく
A 配列は正しくはこう使う。共有されている yuruhiya さんの解答 を見ても LCA#lca メソ
35 36 37 38 39 40 41 42 43 | Dst = lambda{|(a,b)| da,db = D[a],D[b] a = Ans[a,da-db] if db<da b = Ans[b,db-da] if da<db A.reverse_each{|ans| a,b = ans[a],ans[b] if ans[a]!=ans[b] } if a!=b next a==b ? (da-db).abs : da+db-2*D[P[a]] } |
実は解説2にはこれを説明する具体的手順が書いてある(あとで詳しく読んだ)。だけどありとあらゆる落とし穴にはまりたがる自分にと
最終更新: 2021-06-21T21:06+0900
すごく難しいです。答えの出し方に確証が持てないまま、とりあえずグラフとして解答を書いた。クエリ0に応じて辺を追加する。クエリ1に応じてノ
次にクエリ0では Y=X+1 だという制約を思い出して、グラフを配列上に配置した。しかしこれでは多少効率が良くなれど TLE は解消しない。制約はノ
局所の変更を全体に(対数時間で)波及させるのに BIT がまず浮かぶ。何を記録しようか。階差の累積値かなと思
結局 BIT は使わなか
階差を使う解法は完全に「Y=X+1 (T=0 の場合)」という制約に依存しているので、と
解説が公開された。プラスかマイナスか、そんな単純な関係や
Y=X+1 (T=0 のとき) という条件が外れた厳しい方の制約だけど、X から Y へ至る異なるパスがクエリ0によ
連結なノ
全部 Union-Find に乗せたいけどうまくいかない。Unite は当然として、Find で集合の代表を書き換えるタイミングでもごに
自分がやりたいのはたぶんこういうの。や
ところで、Ruby のようなスクリプト言語と C++ の実行時間が接近しているときは、入出力がネ
こ
ノ
偶数世界と奇数世界? これはノ
や
10 11 | D[a] *= D[g] V[a] += D[a]*D[g]*V[g] |
↑ここは無駄なことをしてる。修正版はこう↓
10 11 | V[a] += D[a]*V[g] D[a] *= D[g] |
Union-Find でグル
ノ
これも重み付き UnionFind。ノ
偶奇を一体でぐち
あ find メソ
これだけの学びがあるのは企画の趣旨に照らして(そうでなくても)、すばらしい良問だ
最終更新: 2021-07-12T20:54+0900
A 数列を後ろから見ていく方針は早くに決ま
もう 54 分経
A 数列をソ
デバ
AC までおおよそ 30 分だから B 問題は A 問題より簡単。
盲滅法な探索では時間が足りない。考えても時間の無駄なので興味本位で解説を読んだ>「C - Calculator 解説 by maroonrk_admin」
フ
とりあえず実験をした。x,y=1,1 を初項として操作3と4を繰り返すとどのように値が増加するか。大体 80 数回で N の上限を超える。今度は x,y=0,0 でスタ
つまり、次の提出における A 数列というのは、フ
「貪欲をすればよい
」と解説に書いてあ
「この時,i と i+1 両方で操作することはありません. なぜなら,
」は読み飛ばした。解説の細かい部分にこだわ
WA の原因は問題を読み誤
x と y を取り替えればいいのだから、仮の操作列を作
ARC-C が自分のいるところからどれだけ高くにあるかは垣間見られたのでは? 時間内に B 問題まで解けただけで上出来なのに、レイテ
それもダメ? [[実数の二分探索・三分探索はル
最終更新: 2021-09-14T17:27+0900
AtCoder タグを付けてるけど非公式コンテストです。
この問題はと
この問題で扱われるグラフは DAG (有向非巡回グラフ) といわれるもので、サイクル(閉路) を含まない有向グラフです。
え
辺 i は頂点 Xi から Yi に向かいます。
制約 1≤Xi<Yi≤N
制約が持つ情報量が多すぎて見逃していた。難しい。そして閉路が含まれてるなら含まれてるで、解説3に書かれている強連結成分(SCC)分解を手段として持
まだコンテスト期間中だけどソ
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | N,M,Q = gets.split.map(&:to_i) B = 60 # Bignum に切り替わらないビット数を。 Z = (N-1)/B+2 V = Array.new(N+1){|a| [0]*(Z-a/B) } E = Array.new(N+1){[]}; M.times{ x,y = gets.split E[x.to_i]<<y.to_i } N.downto(1){|a| va = V[a] va[-1] |= 1<<a%B E[a].each{|b| V[b].each_with_index{|v,i| va[i] |= v } if va[a/B-b/B-1][b%B]<1 } } puts$<.map{|ln| a,b = ln.split.map(&:to_i) next %w[No Yes][V[a][a/B-b/B-1][b%B]] } |
2枚目の解説画像で満点解答のために「ビV =
の初期化部分だけで2、3秒かか
AtCoder はスクリプト言語に優しいので、定数倍高速化がキ
昨日の ABC204-D - Cooking の解法はどこか(解説1)で見たような形だなあと思いながら書いていた(この日記を書いてるのは月曜だけど、典型90-059の出題は土曜日だ
キ
最初にすべての頂点について到達可能な点を(テキト
調べたら、重いケ
必ずしも良くないばかりでもなくて、頂点数 N に比して辺数 M が大きい場合、想定解法の方が遅くなる。
基本は提出1と同じ。30 ビ
多倍長が許されるのは数百桁までかなと思
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | N,M,Q = gets.split.map(&:to_i) E = Array.new(N){[]}; M.times{ x,y = gets.split E[N-x.to_i]<<N-y.to_i } V = [nil]*N N.times{|a| va,bs,b = 1<<a,E[a] va |= V[b] if va[b]<1 while b = bs.pop V[a] = va } $<.each{|ln| a,b = ln.split.map(&:to_i) puts %w[No Yes][V[N-a][N-b]] } |
頂点番号とビZ-a/B
という形でや
たぶん Bignum のネ
これは提出1、2と違
DP がしたいのに Bignum を頂点の数だけ保持すると MLE になるのをどうすれば良いか。TLE を避けたいなら Bignum を使うしかないがどうすれば良いか。頂点番号の小さい順にどんどん処理を進めて、使用済みの情報は辺もクエリも遷移してきたという DP 要素もどんどん捨ててい
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 | N,M,Q = gets.split.map(&:to_i) E = M.times.map{ gets.split.map(&:to_i) }.sort_by(&:first) A = Array.new(N){[]} B = Array.new(N){[]} Q.times{|q| a,b = gets.split A[-a.to_i]<<q B[-b.to_i]<<q } r = 0 C = [0]*N N.times{ as,bs,c,q = A.pop,B.pop,C.pop c |= 1<<q while q = as.pop r |= c[q]<<q while q = bs.pop C[N-E.shift[1]] |= c while e = E[0] and e[0]+A.size==N } Q.times{|q| puts %w[No Yes][r[q]] } |
Ruby で満点がありだ
メモリもタイムもさらに良くな
こちらを参考にして。
昨日はうしさんのライブラリを参考にして解いたため、(A_i,B_i)というクエリを処理するときにはdp[A_i]|=1<<iとしていた。そうではなくdp[u]|=1<<uとし、すべてのペアについて問題を解くことにすれば、頂点番号uに対しては1..uに対応するbitしか保存しなくてよいため、必要なメモリが\frac{N^2}2くらいになるらしい。
週記(2021/05/31-2021/06/06) - kotatsugameの日記
頂点番号が小さい順に処理をするという提出3の流れと、頂点番号が小さいものから0に近いビ
整理したからそのまま同じではないけど、だいたいこんな雰囲気>typical90_59_nosub5.rb27
@2021-09-14 結局最後のも提出した>提出 #25841973 (1149 ms)