競技プログラミングのべんきょうきろく

ブログ名からひと目でわかる圧倒的チラ裏

やっと卒論終わった

勉強するぞするぞー(`・ω・´) (機械工学の勉強をするとはいってない)
1ヶ月で22000文字行ってたけどぶっちゃけ時間の無駄でしたね...

 
セグメント木を実装したのはいいけど使い方がわからないので,この辺りを使う問題をね,練習したいね,と
あとドワンゴ予選のC問題も無理だったのくやしい.条件付き期待値ってテーマがなかなか面白そうなのでここらへんの勉強もしたいなー

 

 とりあえず色々あるけどこの行間も治したい.これもそのうちなんとかしたいね
きたない(確信)
(追記)shift+enterで行けるのか.ダルいなぁ

 

ABC 017

 

http://abc017.contest.atcoder.jp/

330/401の42/338位

いままでで最高順位ktkrうれちい!

 

A 100/100

先に掛け算すればいいお膳立て付き

http://abc017.contest.atcoder.jp/submissions/318701

 

B 100/100

パターン1 o,k,u

パターン2 ch

の2パターンでいろいろ考える

他にもっと難しい問題が山ほどあるから難しいってことはないけど,ABCにしてはちょっとややこしい気もした

http://abc017.contest.atcoder.jp/submissions/318919

 

C 100/101

101は無理ゲーだった.どうやら発想の問題らしい.

通らない区間を1個定めて他をかき集めるって方法で100点までのテストケースは通った

実装的には全列挙よりすごい楽だった

http://abc017.contest.atcoder.jp/submissions/319375

 

D 30/100

要素が重複しないところまで配るDP

念のため番犬を配置しておいたけど必要なかったっぽい

最悪でO(N^2)だから100点行けなかった・3・

http://abc017.contest.atcoder.jp/submissions/319645

 

部分点で妥協した場合で制約条件を超える値のテストケースについてはさっさと諦めreturnさせないとえげつない計算時間がかかるんで,自分の結果が中々わからないしジャッジ側にも無駄な計算で迷惑かかるし今後気をつけないといけないなーと

 

 

 

lognもバカにならないねというお話

ARC 028 B問題

B: 特別賞 - AtCoder Regular Contest 028 | AtCoder

 

ぼくのていしゅつしたこおど

http://arc028.contest.atcoder.jp/submissions/316795

 

この問題の解説は俺の適当で不正確なアレより公式の記事のスライドが素晴らしいので省略(4ページ目から)

AtCoder Regular Contest 028 解説

 

 

http://ufcpp.net/study/algorithm/col_heap.html

↑ C#に関してはお馴染みオブお馴染みなこ↑こ↓のサイトの記事を元に自分で優先度付きキューを実装したやつです

何が言いたいかというと,計算量はまったくヒープ型の優先度付きキューと同じってっことだけーーー.

ヒープを使えば,数値の追加や先頭の要素の削除はlognで行えるんで,

k+1からn回目に繰り返しキュー内が更新されるので,この問題だと最終的な計算量はO(klogk)に.なる.

 

ここからこの記事の本題で,今まで,lognならほぼ1とみなしたって問題ないっしょ!って思ってたけど,

性能を試してたときにこの優先度付きキューでn=1000000あたりからTLEを起こすくらい遅い.辛い.

これがわからないこれがわからないってなってたけど,

log_2(n)で底が2だから log_2(10^7) = だいたい7*3.3 = 20になるんで

n = 10^7 のときのn*lognは一段上がってしまって

n = 10^8のときのnと一緒くらいの重さになってしまう 

底が違うから思ってるより重いっていう勉強になりました(小学生並みの感想)

 

ここまで書いてあれだけど,コレクションとかもろもろの操作で自分の作成した奴のオーバーヘッドがでかすぎるのかもしれない

 

マカロニダァイスキ

MultiSetの実装方法がわからない,コレクション使い回しでできないかなぁ

 

 

初めてARCのC問題を通したゾ!

ARCがBで時間切れ,Cもまぁむり,Dは論外ってレベルだったけど

C問題を初めて通せた^q^^q^^q^ なお70分かかったもよう

 

問題のURL

http://arc017.contest.atcoder.jp/tasks/arc017_3

 

ぼくのかいたこおど

http://arc017.contest.atcoder.jp/submissions/316493

 

2^nがを用いるパターンは nが異様に小さいのがヒントになるね.

二分割でビットDPしてけば2^32/2 = 2^16で通るのも簡単に予想できる.

2^10 ≒ 10^3が目安になるかなーと.

 

逆に10^9が与えられたらオーダーに含めない形にするか,lognまでオーダー落とせっていう目安が与えられたり.この手のだとO(1)で求められる可能性もある.

New Year Contest 2015

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

2015を記念して13題です.

 

2015を記念して13回書きました.

Bで終わった,しにたい

 

下にいろいろ書いてるけどまだ実装してません^q^

 

A

うまくANDマスクとかビットシフト使ってforループ回して01文字構成

x = 2 (2進数で10)のときn && x / x で一つのビットが1か0かわかる

7が110じゃなくて011になっても対象かどうかの判定は問題なくできるのでそのへんは気にしなくてよかった

 

B

ソートして小さいものを敷いていく貪欲法

その時の和をメモっといて次の鏡餅が持つか判断

 

C

今考えてる.

先頭の文字,と連続する2文字以上のものを抽出してリストを作ればsとtのやつで完全に等価じゃないとダメ

あと,リストの間の部分文字列にたいして,sの文字順通りにtを構成できるかどうか

のあたりが問題なければsからtを構成できると踏んでる

計算量も問題ないはずだけど

 

D

幅優先探索考えてるけど,頂点も辺も無限に膨れ上がるんだよねこれ

無理ゲー感すごい,条件次第で∞まで増幅してくっそ離れたところ(-1000000?)以降を枝刈りしてもよさそうだけどどこまで刈ってもいいかの根拠が見つけられない(区間をうまく定めないと答えが求まらない可能性がでてくる)

メモ化再帰幅優先探索で最悪O(メモの区間*クエリ問い合わせ数)になるかなぁとは思う.

他の人の回答を見たところではメモの範囲を-100050~100050でとってたけど,どうやってこの最大容量を見積もったんだろ

 

E

n人にn-1本のひも

ひも 線?グラフ理論

 

一人に対し1~3本つけるってのもミソで,一端2本繋ぐ人を省いて

まず1本,3本付く人で木が構成できる(閉路なし)

構成した木はただ一意に求まる. この1と3,3と3のつながった部分に2人の人を挟み込んでも木の構成は正しいまま

この1,3本の人の最小木に対する場合の数と2本の人の入れ方の場合の数に分割して

人の番号を区別して階乗とかもかけていくと求められるはず

 

いま k/n mod  1000007 ( k,n ∈N)の対策が考えられてないです.これもなんとかしないと求められない・・・

 

 

F以降

まだ問題の解釈ができてないです

Kからはハナから捨て問よぉ!

 

新年から軽いノイローゼになるくらい難しかった(小並感)

きれそう

code thanks festival A日程の覚書

Fまでいけた(Gでうまく実装できなくてつみ)

 

Hで100点取る方法は皆目検討つきませぬ^q^

部分点は全探索してO(n^5)とかになるんだけど通るはずっしょ

やってないけど

 

G

うまりを○

空き席だけど隣に人がいるのを●にして

初期状態○●から○○●あるいは○●○●になる

これをみると○+1,●+0 , ○+1,●+1に遷移することがわかる

また,隣に人がいてもいいなら○●○●→○○○●で○-1,●+0とかもある

ここで,6席しかないと仮定して,○●○●○●の場合に隣に人がいるといやなら○+0,●+0

とかもありえる

こういった断片的な遷移をうまく組み合わせて確率を求めてくDPをすればよかったんじゃないかなぁ(できたとはいってない)

答えは,すべての席から○の個数を引くと開いた席の数(●は空席!)になるので,これに確率の重みをつけて総和求めればパパっと終わり

 

できたとはいってない

ほしいぜ実装力

 

 

code thanks festival 2014 B日程の覚書き

 本番ではEまでいけた,(F,G,Hはこころがおれた)

でも本来はFも余裕なはず

 

A Max

B 全探索やるだけ

C やるだけ

D 配列用意してAi , 2Ai, 3Ai,に1プラスして,最大値を求めたら,それが答えになる

E 条件にそって二次元グリッドを塗りつぶしてから,メモ化再帰

 小さいから行ける

 

F

DP使う.n番目の文字からk文字のSを含んでたらdp[n] += dp[n-k]

r文字のTを含んでたらdp[n] += dp[n-r]

するだけ.なんで諦めたのか謎謎謎クソザコナメクジ

問題文の前から読み込んでいってね!のヒントに気がつけなかった

 

G

N,Pが大きい状態で始めてしまうと全く検討つかない.NimとかGrundyとか当てはめようとしたのがうんちすぎた

逆に,N,Pが小さいうちなら簡単に判定できる ので   D   P

自分の手順でN ≦ Pなら明らかに勝ち

N>Pのとき,dp[i,j] = _dp[i-1,2] or _dp[i-2,3] or ... or _dp[i-j,j+1] 

_dp[i,j]はdp[i,j]のnot論理値

与えられた入力に対して,相手を負けに落とし込める状態が一つでもあれば勝ち

dpは常に取る側視点で考えるのでnotを取る

 

H

まだできてない.

ごちゃごちゃしてるけど,先頭と最後尾だけに注目すればいいはず.

AB,BC,CD,EF,FC のとき,ABCDとEFC にしても,ABCFE,とCD にしても

結局追加で結合するための文字がひとついるから,とにかく貪欲法で結合してけばいいんじゃないかなと思ってる.