最終更新: 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)
最終更新: 2021-06-05T05:03+0900
解説画像はこちら>https://github.com/E869120/kyopro_educational_90/blob/main/editorial/057.jpg
この問題はとても良か
最初は独力でパネルを順番に見ていく DFS を書いた。それしか知らない。だけどどうしても入力に左右されるし、あるパネルに影響する複数のスイ
入力を前処理して扱いやすくするとは考えてもみなか
でまあ今後は、こういうことができると知
具体的な実装にも迷いがある。スイ
ステ
hai!@magrofly「典型057 Ruby https://t.co/Dri1yBSvuK」 / Twitter
「基底を求める」のはよくわからないけど、「解く」過程では順番に適用していくだけでいいようだ。さ
最初の提出。無駄にソ
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | N,M = gets.split.map(&:to_i) A = N.times.map{ gets next gets.split.map{_1.to_i-1} } S = gets.split.map(&:to_i) n,T = 0,[0]*M while as = A.sort_by!(&:first).shift i = as[0] A.map!{|bs| i < bs[0] ? bs : ((as|bs)-(as&bs)).sort }.reject!{|bs| bs.empty? && n+=1 } as.each{|i| T[i] = 1-T[i] } if S[i]!=T[i] end p(S==T ? 2.pow(n,998244353) : 0) |
ツイ
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | N,M = gets.split.map(&:to_i) A = N.times.map{ gets next gets.split.map{_1.to_i-1} } S = gets.split.map(&:to_i) N.times{|i| next if A[i].empty? (i+1...N).each{|j| next if A[j].empty? if A[j][0] < A[i][0] A[i],A[j] = A[j],A[i] elsif A[j][0] == A[i][0] A[j] = ((A[i]|A[j])-(A[i]&A[j])).sort end } } A.reject!(&:empty?) O = N-A.size T,as = [0]*M,nil as.each{|i| T[i] = 1-T[i] } if S[as[0]]!=T[as[0]] while as = A.shift p(S==T ? 2.pow(O,998244353) : 0) |
最終更新: 2021-06-24T16:08+0900
★2つだから
N,P,Q,*A = $<.read.split.map(&:to_i) p A.combination(5).count{|a5| Q == a5.inject{_1*_2%P} }
結果は TLE×21/AC×4。なんだよ全然ダメじ
ABC192-F Potion (20210224p01) を思い出しながら悪あがきをした。
N,P,Q,*A = $<.read.split.map(&:to_i) q = Hash.new 0 S = A.map{|a| q[a%P]+=1; q.dup } (N-1).downto(N-4){|k| S.pop # S.size==k q = Hash.new 0 S.map!.with_index(N-k){|q0,i| a = A[i] q0.each{ q[_1*a%P]+=_2 } next q.dup } } p q[Q]
これで TLE×6/AC×19。0≤Q<P≤10^9
という制約がえぐすぎるんよな。大きすぎるし、素数じ
N が 100 以下というところで何かできないかと考えた。3..100 のある i より左から A×A のペアを作
Ruby を使う良さ
Ruby で 365 ms の解答が共有されているなあ。見たい、見たくない、見たくない。
典型 90-005 の解説から>「mod の値が 998244353 のような特殊な値ではないので一工夫必要ですが、それでもたとえば 3 種類くらいmod を用意して中国剰余定理で復元する方法などで上手くいきます」。中国剰余定理は Wikipedia やブログを読む機会が何度かあ
最終更新: 2021-06-08T14:11+0900
競プロ典型 90 問の 043 - Maze Challenge with Lack of Sleep(★4)が普通に解けたので、Pond Skater (青diff1968)も解けるような気がした(既視感>20200826p01。根拠は必要ない)。
All AC になるまで死ぬほどバグらせた。これが時間内に解ける未来が見えない。訪問済みフラグが二値ではない。ル
無駄に難しくしてる? そうであ
比較すると短いし速いし省メモリだと思う。テストケ
訪問済みフラグを水平方向と垂直方向に分けたのが間違いだ
Vh と Vv だ
最終更新: 2021-06-08T14:41+0900
解けてしま
ちなみに F 問題の提出(Ruby)はなか
話は E 問題。こちらはやること自体は明白で、読めばわかる。木が与えられて、深さを調べるのも、親を辿るのも、基本操作だ。この問題の問題は制約にあ
実装しなか
一直線の木で Σk 個の要素を処理するような実装でなければアリなのか。
これはマ
基本形はさ
これは他の人の AC 提出を読んで知
確かなことはこのあたりの提出を読めばわかる。(提出の早い順)
メモリ消費にけ
最終更新: 2021-04-30T21:11+0900
「10分間3問早解き」回だ
AC のき
chokudai(高橋 直大)ナス@chokudai
D問題、非連結です
Twitterって言うだけでDiff400くらい落ちそう
chokudai(高橋 直大)ナス@chokudai
非連結です
って言 っても落ちないわ(サンプルにあるし) 連結で出題しないと400落ちなさそう。
Twitter
「連結で出題しないと落ちない
」がよくわからないけど、ともかく、非連結なら問題を分割できるじ
サンプル4つのうち2つが辺がゼロのケ
テストケ
しかしまだ TLE。どういう木が嫌か考えると、この提出は次のような入力に弱い。
だけど次のように番号の付け方を変えただけで問題が問題でなくなる。
たぶん頂点を次数でソ
ソ
DFS の処理順を次数の降順にしたら悪くなりにくいのか、343 ms からタイムが大いに改善した。このムラが DFS の沼であり抜け出せない楽しみなんだよなあ>20201101p02、20201107p01.05。
最終更新: 2021-06-08T15:01+0900
昨日あ
本番中は TLE で終わ
制限時間が大盤振る舞いの5秒なんだよね。
桁を1つ2つ減らすだけで時間がだいぶ違うだろうという予測はできたけど、減らし方がわからなか
TODO: Array#all? の中のテストは l<=r
より l==r||l+1==r
の方が厳しくて良い。
TODO: 和の先頭の桁が1だとすぐにわかる場合がある。
TODO: 列挙してから弾くより列挙しない方がいい。(確定桁が1つあ
TODO: ル
現在 Ruby での AC 提出は 20。実行時間が 109 ms から 4845 ms までと幅広い。中央値は3秒台です。
たとえば(4桁 ms では最も速い)約 1.6 秒のこの提出>#21688714
先頭桁が0のケ
それと、全くの想定外だ
3つある3桁 ms の提出が何をや
4つの TODO を意識して書いたけど、妥協した部分もある。
とはいえ、これを深さ優先探索で妥協なく書き換えただけで2桁 ms になる? そう、Ruby で現在最速の提出は 71 ms にな
根本的なところで、列挙してから弾くか、可能性のある組み合わせだけを列挙するかという違いがあるのかな。そ
書けなか
WA の原因は非ゼロチ
雑に総当たりしていたのを反省して(TLE は嫌だ!)、数か月ぶりに書き直した。提出 #21743445 をベ
A = 'FDCAJH'.bytes.to_a # to_a is for Ruby 1.8/1.9 B = 'IBCFEH'.bytes.to_a P = 'FBAECIIJEGIH'.bytes.to_a C2D = [nil]*91 D2C = [nil]*10 NZ = [-1]*91; NZ[A[0]] = NZ[B[0]] = NZ[P[0]] = 0 F = lambda{|i,carry,aa,bb,zz| next carry<1 if i<-P.size a = (c = A[i]) ? C2D[c] : 0 b = (c = B[i]) ? C2D[c] : 0 if a next D2C.each_with_index.any?{|e,d| next if e || d==NZ[c] C2D[c],D2C[d] = d,c next F[i,carry,aa,bb,zz] || C2D[c] = D2C[d] = nil } unless b prd = a*bb+b*aa+a*b*zz+carry if p = C2D[c=P[i]] next p==prd%10 && F[i-1,prd/10,a*zz+aa,b*zz+bb,zz*10] else p = prd%10 next if D2C[p] || p==NZ[c] C2D[c],D2C[p] = p,c next F[i-1,prd/10,a*zz+aa,b*zz+bb,zz*10] || C2D[c] = D2C[p] = nil end } raise unless F[-1,0,0,0,1] puts [A,B,P].map{|a|'%*d'%[P.size,a.inject(0){|b,c| b*10+C2D[c] }]}
最終更新: 2021-06-02T21:11+0900
緑がほぼ埋ま
だから青色。難しか
今回も一発 AC とはいかなか
たとえば赤か青の片方が極端に多いとき、外側に広が
しかしそれを想定するとコ
ちなみにこの提出の方針は……。赤と青をそれぞれ -100 と 100 を中心にして原点の左右で平らに並べる。原点は超えない。数が多ければ外側により大きく広がる。そのあとで緑色を原点を中心として配置していく。左右のコストを比較して赤と青を押しのけながら。
提出に至らなか
「J - 長い長い文字列」(提出 #19035422) とか、「K - 転倒数」(提出 #18029328)とか、脳みそに余裕がなくなるとクラスや日本語変数がソ
イメ
Ruby の他の提出を見るとゴルフをしていなくても 300 バイト台の短い提出がいくつもあるし、内容も、候補を並べて最小値を選ぶ、二分探索で解(極小値)を探すなど、特に大層な道具は必要としていない。それは、頭の中で十分に理解して整理できているから書けるんだよなあ。
できないからソ
たぶん抗力の計算が間違
押した力を上限として0以上それ以下の力しか発生しないはずだけど、なんだか負の抗力によ
これが問題にならない理由もわかるけど、それはクラスの外部、インスタンスの利用方法にあるのであ
最終更新: 2021-06-08T15:27+0900
ABC の4問目で 400 点問題。しかし青diffではある。
時間制限を 10 秒にしてくれたらたぶん通る。しかし実際の制限は2秒であり、3秒ですらない。慈悲はないのか。
Ruby の提出一覧を見ると AC していても軒並み1秒越えであり、処理量がしんどい問題なのは間違いないのだけど、その中にあ
入力を正負ゼロに分けて、正負ゼロの積がそれぞれいくつ作られるかをまず求めた。
負の積が K 個かそれより多いならば、正の数と負の数のペアを考える。ゼロは特に考えることがない。K 番目が正の積の中に含まれているなら、負の数同士のペアと正の数同士のペアを考える。
これで考えるべき組み合わせが多少は減
それでどうしているか。
K 番目の数を -10^{18} から 10^{18} の範囲で二分探索している。
ペアを、ある数とそれに掛け合わせるソ
ペアの数が馬鹿にならない。N (≦2×10^5) のオ
とまあ、こんな感じ。(3つだが三重ではない)二重の二分探索のあいだに、範囲を絞
ソ
この回 は「C 問題が解けなくて大爆死した回の ABC」。その後 C 問題を解いて、F 問題も解いたけど、「F 問題が解けたら D と E も解けたつもりでいいんじ
え
今日の日記のタイトルは「D 問題 Pairs」です。関連は?
これまで二分探索といえばソ
という気付きが Pairs を解く過程で(まだ解けてないけど)得られていたので、今度はごく素直に、解を決め打
二分探索を使
脳みそが不自由だと存在しない制約で思考が枷をはめられてしまうのだなあ。最も基本的なツ
ところで 350 ms は Ruby で2番目に速い提出なのだけど、どんぐりの背比べである2番目とそれ以降から頭ひとつ抜けて速いのがこの 提出 #15632506 (sushibon さん / 219 ms)。二分探索は行
二分探索というのは人間が考えることを放棄して機械に試行錯誤させる解法なのだけど、人間が頭を使えば無駄なく速く答えを求めることができるのですね。まあ、何をどう考えればいいのかわかりませんけども。
これも空中二分探索。解を決め打
Ruby では唯一3桁 ms に入
同じ青diffでもこちらのほうが Pairs よりわずかに難しいことにな
しかしこれは簡単な Pairs ということでいいんではないか? だ
概ね 300 ms から 500 ms の間におさま
ル
や
どこでオ
ヒントはこの問題の前に解いた射撃王にあ
実際のところ、二分探索の代わりに shift/pop を繰り返すようにしただけ。
261 ms の提出を読んだ。A 数列の値から添字を得る逆引きインデ
言われてみれば、そうだね、という感じ(だけど思いつかなか
や
これもや
ところで、ぎりぎり3桁 ms には入
最終更新: 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個しかなか