AHC054 日記

ほとんどコンテスト中に書いたもの(一部編集)です

文体が終わっていたり嘘が含まれていたりします

1日目(9/19)

スタートダッシュ賞楽しみ~

インタラクティブ

目的地設定するの一様ランダムなのか

嫌がらせの最適化、おもしろ

よくわかんないけどジグザグにすればまあまあいやな気持ちになるのでは?

あ~もともと木が植えられてるのか

これスタートダッシュするの大変すぎる

とりあえず最初のターンだけたくさん植えてみるか

目的地になりうるマスを増やしつつなるべく確認済みマスを増やさない感じか?

うまく渦巻みたいな感じでAAを隠してもそこを通られると勝手に最短距離にされるのか

すでに助けて~という感じに

四方向それぞれに全体が連結ならトレントを置くのが強いらしい このゲーム難しすぎる…

あ~最短路が決まるからいい感じになるのか なるほどね~

これスコアが伸びれば伸びるほどTLが足りなくなりそう

2日目(9/20)

初日12位だった 微妙にスタートダッシュ賞とれてなさそ~~~

確認→移動→トレント設置の順に起こるから冒険者の真横にトレントを置けるのか(今更!?)

目的地がいつ変わったかがわからないの、どうすればいいんだろう

とりあえずAAをうまく隠したいが、どうすればいいんだ

なるべくそこを通られないようにしたいので、先に周りに木が生えていることを明かしたい

逆に、AAがバレる可能性のあるマスはたぶん2マスまでしか減らせないのでそれさえうまくできれば余計なトレントを置かなくても済みそう

あ~AAの隣のマスを通られるのも困るのか

だから、Aを花、oを空きマス、xを見られなくてもいい木、Xを見られないといけない木、-を何でもいいとして

-X-
-ox
xAX
-X-

になればいいのか(まあ冒険者のいるマスと連結じゃないといけないけど)(8通りある)

この形は前からやってたけど意外と見せる木は少なくてもいいのか

とはいえどうやって無理やり木を見せればいいんだ

とりあえず近くに来たら置けば行けるか?

3日目(9/21)

いやそこに木を置くとAAと連結じゃなくなるときすぐ詰むな ひ~~~~~

なんかそれ以前でバグっているな 助けて~~~~~

if(!ok) continue;を if(ok) continue; って書いてた ?????

でもダメそう

先にAAの周りを囲うと目的地に向かう途中にAAを見つけられる可能性があるし、近くに冒険者が来たらAAの周りを囲おうとすると連結を保つのが難しい  う~~~~~ん

先に危なそうなところは埋めておくか?

いや~一回見られたところに木を置けないのつらいな~

1マスとなりの四方向だけ見てたけどkマスとなりの四方向を見るようにしたら伸びた 確かにな~

でもジグザグしちゃうな これは強いのか…?

ちまちま頑張ることで1ページ目に戻ってきた

長期コンあるある:提出したら自分の順位は伸びたけど、ほかの人の相対スコアもちょっと伸びたとき微妙な気分になる

いやお絵描きする分には楽しいけど実装するのめんどくせ~~~~~

....x.
..X.o.
..oxox
.xAXox
..X.o.
....x.

みたいにすればうまくいくか…?いや微妙そ~

4日目(9/22)

今日の夢:自分と上位陣の解を同時にビジュアライズする機能があった。そして上位陣も同じ感じで途中で詰んでたから別にいいんだと思った。(でも思い返すとあのビジュアライザ詰んだ後も点入ってたな だからダメそう(?))

いやルールベースでAAの周りを見せるのは難しいか…?

提出したけど下がった う~~~~~ん

なんかまだhighest持ってるっぽいな

一回詰み回避のことは忘れるか?

手数を増やすなら

x..
x.x
x.x
x.x
..x

みたいなのは強いか?

なんかあんまり強くなさそ~

AA周り、

..x.
xoox
.xAX
..X.

にすれば一つ見るべきマスが減るのか

待てよ…

..x..
xacx.
.xAdx
..xb.
...x.

の形にしておいて、冒険者がaに来たらcを、bに来たらdを閉じればいいじゃん! うおおおお

これ考えつけたのめちゃくちゃ気持ちいいな パズルみたいだ

あとはこれを4回転させればOK 持っててよかったrotateライブラリ(?)

AAが端にあるときはいらないところに木を生やしちゃうな まあとりあえずはいいか

ふ~む 100ケース中16ケースでこれの構築に失敗してる

あとAAが壁の隣のときとかに壊れていそう

これパズルすぎるな

端は

(注:これは壊れています)

..x..
.aeb.
xcAdx

にしてaに来たらcとe、bに来たらdとeを閉じればよさそう

隅は

.xA
...
..x

でよさそう

隅の1つ隣は

(注:これは壊れています2)

xAx
..x
.x.

でよさそう

なんかさっきの2つ閉じるテクを使ったら別の詰み回避ができそう

(注:これは壊れています3)

..x..
.ap..
xpApx
.p..p
..x..

にしてaに冒険者が来たらpに置けばよさそう いやこれは必要な空きマスが多すぎるか?

(注:これは壊れています4)

..x..
xap.x
xpApx
xp..x
..x..

でもいいけど…

さっきの端のやつ、

(注:これは壊れています5 壊れすぎ…)

.axb.
xcAdx

でいいのか

5日目(9/23)

とりあえずさっきの両端からの構築に失敗したら適当に前の5本生やすやつで埋めることにするか

提出したら61Gで13位になった お~

これ新しく見るマスを最小化するように移動したらいい感じになる?まあその方法がわからないんですが…

いや端のやつこれじゃダメじゃん 先にc見られたら何もできない

.x.x.
.axb.
xcAdx

じゃないとダメだ

とりあえず詰む問題は大体どうにかなったからこれからはちゃんと冒険者の移動回数を増やすことを考える必要がある

このルールベースだと何もできないな

詰み回避するやつ、反転させたら候補が増える!?→aとb、cとdが入れ替わるだけでした…

上で書いてたpに4つ置くやつ、先に見られるから不可能でした…

う~んギザギザさせようとしても微妙そう

閉じてもあんまり意味がないところは閉じなくてもいいのか?う~ん…

最初に真ん中に道を作るようにしたらちょっと伸びた

おい隅の隣これじゃだめじゃね~か!

.xAx
x..x
..x.

じゃないとダメじゃん も~

やっぱ最小マスで繋ぐみたいにするのがいいんじゃないのかなあ

6日目(9/24)

最小マスで繋ぐためには目的地を推測する必要があるが、目的地を推測するには冒険者にある程度自由に動いてもらう必要がある

一回推測→Kマス進むみたいな感じならいける…?

7日目(9/25)

多分最高スコアを達成できるのは今まで通ったマスを全部通り、かつ新しく見るマスが1つ(ジグザグ見てく感じ)なはず

だからスコアの上界は1+2+3+…N*N=N^2*(N^2+1)/2

だけど木があるし目的地がランダムだからこんなスコアにはならなそう

でもseed0はN=20なのにまだ1000点くらいしか出てないんだよな~

ということは冒険者をたくさん動かすのではなく数回の長距離移動を目指すべき?

でもそもそも14回くらいしか目的地が変わってないっぽいな

出口(?)を二点だけにするのはアリかも?いや難しいか…?

最初に穴開けたらめっちゃ伸びて66Gくらい、8位になった うお~

こういうのをたくさん埋め込むのがやっぱり強いか?

何がヤバいって多分トップ層はここら辺までを1日目に思いついてたんだよな

ここからはどうやってこの形を作るかという問題になってきた

8日目(9/26)

四方向の一番近くに置けるなら置く貪欲を最初のターン以外はするとして、最初のターンだけ木のおき方を決めれば大体のスコアがわかる…?

でも1ターンシミュレーションするのにO(N^2)かかるからKケースTターン試したらO(K*T*N^2)になるしな~

そもそも1マス変えたくらいでスコア変わるのか?

とりあえず保留で…

いやジグザグ2行書くの面倒すぎるからこっちをやろうかなあ…

これは言い訳なんですけど、スタートダッシュ賞を狙ってめちゃめちゃなコードを書いて、それを無理やり継ぎ足していったせいで今大変なことになっています

なんか山登りしてできた解を見る限り木(グラフ)を作るのが強いっぽい?

確かにそれはそうで、最終的に木を置くならあらかじめ形を作っておいたほうがいいのか

これしかも微妙に木じゃない なんだこれ

ぐわ~一生バグっている

どうにか実装はできたけどあんまりいいスコアにはならない

目的地の選択順番が分かればな~

9日目(9/27)

結論:目的地の選択順番が分かんないと無理そう(モンテカルロにしてもまあ微妙)

10日目(9/28)

2行ジグザク書いたけどダメそう

ちまちま改善している

一応多少木を置くことで強くはなるっぽい(乱択だけど…)→全然だった

TODO:緊急回避を書く

11日目(9/29)

ちょっとだけ改善して終了…

結果

暫定16位、最終27位でした ぐわ~

AHC ざっくり問題設定一覧表

まあまあ雑なので問題ページをちゃんと確認したほうが良いです!

問題ページ ざっくり問題設定
AHC054 冒険者がなるべく長く森にいるようにトレントを配置する
AHC053 予め値を決めたカードを捨てるか山に分けそれぞれの山の値の和を目標に近づける
AHC052 複数のロボットを使ってオフィスの床をワックスがけする
AHC051 ごみ処理場内で、複数の分別器を使ってごみを分別する
AHC050 スケートリンクを滑走するロボットが生き残る時間の期待値を長くするように岩を置く
AHC049 それぞれのマスにある荷物を積み重ねて運び出す
AHC048 3次元ベクトルで表される絵の具をパレットで混ぜて目的の色に近づける
AHC047 目的の文字列が連続部分文字列に出てくるようにマルコフ連鎖モデルを作る
AHC046 スケートリンクで移動 or 滑走 or ブロックの制御をして、目的地を通る
AHC045 指定した都市集合の最小全域木を占い、グループ分けしその全域木も出力する
AHC044 各社員の次の掃除当番を割り当て回数の偶奇で2人決め目標の割り当て回数に近づける
AHC043 R国に線路と駅を設置して最後の資金を最大化する
AHC042 グリッドの行と列を動かして、福を残しつつ鬼を取り除く
AHC041 無向平面グラフから大量に高さ制限のある木を切り出して見栄えを良くする
AHC040 指定した配置の横幅と縦幅(誤差あり)を聞き、横幅と縦幅の和を最小化する
AHC039 網で多角形を構築してイワシを避けつつサバを捕獲する
AHC038 木構造のロボットアームを作り、グリッド上のたこ焼きを指定のマス集合に移動させる
AHC037 2次元ベクトルで表される炭酸飲料を2つに分けて、指定の炭酸飲料を作る
AHC036 Y国の信号を操作しながら目的地を順番に訪問する
AHC035 与えられた種を選びグリッド上に植えることを繰り返し、優れた種を作る
AHC034 建設予定地の土砂を、ダンプカーを使って積む or 降ろす or 運ぶことで整地する
AHC033 順番と搬出口が指定されたコンテナを、複数のクレーンを使いグリッド上を運搬する
AHC032 3×3のスタンプでマスに整数を加算し、マス mod 998244353の総和を最大化する
AHC031 各日ごとにイベントホールに軸と平行なパーティションを設置し、区画を割り当てる
AHC030 島の地下を1マス掘る or 島のマス集合を占うことで、どのマスに石油があるか特定する
AHC029 方針カードを使って会社を経営し、最後の所持金を最大化する
AHC028 グリッド上のキー配列の上で、目的の文字列が連続部分文字列になるように指を動かす
AHC027 オフィス内の指定したルートを無限に周回するロボット掃除機で、オフィスを掃除する
AHC026 複数の山に積まれた段ボール箱を、箱のかたまりを移動させて順番通りに運び出す
AHC025 天秤を使って重さの比較をし、アイテムを重さの等しい集合に分割する
AHC024 グリッド上の地図を隣接関係を保ったまま小さくする
AHC023 長方形の土地の区画に、植えられる最終月と収穫する月が決まっている作物を植える
AHC022 グリッド上に指定しておいた温度を測り(誤差あり)、ワームホールの出口を推定する
AHC021 ピラミッド型に並んだボールを入れ替える
AHC020 各通信ケーブルの電源と各放送局の出力強度を調整してすべての住民に配信する
AHC019 ブロックのセットを3次元空間に配置してシルエットを作る
AHC018 グリッド上の岩盤を破壊し水源から家まで水を流す
AHC017 平面無向グラフの道路を、市民の不満が少なくなるように工事する
AHC016 グラフを過去に送り、番号が消えノイズが入ったグラフがどれかを推定する
AHC015 毎ターン受け取るキャンディーを、箱を傾けて整理する
AHC014 方眼紙から点を選びたくさん長方形をつくる
AHC013 サーバ室のコンピュータをケーブルで接続する
AHC012 円形のケーキをうまくイチゴが乗るように切り分ける
AHC011 スライドパズルを操作し、木を作る
AHC010 線路タイルを回転させ、できるだけ大きい環状線を2つ作る
AHC009 忘れっぽい高橋くんをグリッド上の自宅からオフィスに文字列を使って移動させる
AHC008 部屋に仕切りを設置し、人のスペースに動物が入ってこないようにする
AHC007 毎ターン各辺の真の長さが与えられるので、全域木の総長を最小化する
AHC006 注文を選び、レストランから配達先へ料理を運ぶ
AHC005 障害物と道路からなるグリッドを、全道路を視界に入れるように巡回する
AHC004 宇宙人の遺伝情報の一部である文字列が連続部分文字列になるような行列を作る
AHC003 無向グリッドグラフ上で、与えられた2点間の指定したパスの長さが返る(誤差あり)
AHC002 高々1回まで踏むことができる、1×1 or 1×2 or 2×1のタイルからなる床のマスを訪れる
AHC001 各企業から指定された座標の近くに指定された面積の長方形の広告を出す

AHC043 日記

ほとんどコンテスト中に書いたもの(一部編集)です

文体が終わっていたり嘘が含まれていたりします

1日目(2/14)

うおおおお

インタラクティブではないっぽい

この線路久しぶりに見たな なんだっけ→AHC010でした

これ面白そ~~~

利用料金はマンハッタン距離なので遠回りはさせないほうがお得そう

終盤だと駅と線路どっちを先に作るかとかも考える必要がある? 流石に嘘か

ターンの最後に所持金を最大化するタイプのゲーム、今までうまくできたことない気がする

線路の次数は2だからいろいろ連結するのは難しい?

駅を中央に置けばできないこともないか(駅の次数は4なので)

いや~どこから手をつければいいかよくわからん

線路を交差させられないのも地味に面倒

TLが3秒なの忘れそう

家と職場が近い人は駅さえあればお金払ってくれるの面白いなと思ったけどそういう入力は生成されないっぽい

線路は駅にできるらしい いつか使えそう

とりあえず駅同士の連結は保留で2つずつ使うことにしようかな

線路の次数が2&駅から2マス分しか動けない→最悪の交通網になってしまう…

ハブ駅をうまく作れればいいが…

近い駅に繋げるコード、書くのが面倒くさいよ~~~~

↑これはそうでもなくて(割と簡単で)、TLが足りない(一回走らせるのにN^4かかる貪欲を60回くらい走らせてるのでまあそう)

最終的には木になるっぽい(まあそうか)

2日目(2/15)

意外と次の頂点を1つ探すのが強くて34.0Gだった

seed4とかは弱そうだけどどうなんだろう(そういうケースがあんまり入ってないだけ?)

これスコアlong longがいる?→たぶんいらない(2N*M*T+Kで抑えられるので)

とりあえず最初に2点選ぶのを乱択にしてみる→39.2G

素直に考えるとビームサーチできるな(流石に時期尚早な気はする)

線路→駅の順番で作ったほうが資金を貯めこめる気がする

本当にちゃんとやるなら最初も線路→駅の順番で建設するべき?→そんなことはなかった(最初は2つ駅を作らないと資金が増えないので)

人があんまりいないseedは木じゃなくて森を作るほうがよさそう?

ちゃんとどれだけ資金をため込むかを二分探索して39.6G う~む

今まではちゃんと残りターンからこの更新を受け入れるか考えてたけどこんなこと考えなくても別に更新を受け入れないまま最後まで行くパターンをchmaxしてあげれば必ず更新するとしていいのか これ初めて実装したかも  

最終盤面だけとかだったら焼けるのにな~

なるべくたくさんの家と職場を巻き込んどきたいな~と思って試しに評価関数に家と職場の数掛けてみたらめちゃ強くなった そんなに良くなるのか

sqrtにしたらさらによくなった ヤベ~

44.4Gで1位 やった~

う~ん 線路が長いのもあんまり嬉しくないな 適当に評価関数に組み込んでみるか

強くはなったけど点数が小さめのseedでは悪化してそうな気もする

提出して46.5G いいね

焼きなまし、最終盤面からのスコアならできなくもないかもしれないが途中からのスコアが重要なseedでうまくいくのかな わからない…

起きたら2位になってた

線路の長さの評価関数は捨てて線路上に駅を建設するのを許容したら(なんで許容し損ねてたんだ)ちょっと強くなった

提出して45.9G

グリッド上の家/職場の数をちょっとだけ評価関数に足す&なるべく家/職場が多い所に線路を引くようにして46.5G

評価関数をいじったらまたちょっと伸びて47.4G なるべく近いところを結ぶようになっている?

点数が低いところは捨ててもいいのか?

3日目(2/16)

4位になってしまった(40.7G)

最終盤面の焼きなましとかしてみたいがターン数の推定とかは厳しそう

とりあえず素直にビームサーチ書こうかな…

起きたら6位だった でも40.3Gなので最上位のスコアはあんまり変わってなさそう

すでにpopしたpriority_queueの要素を参照していて大変な目にあった…

とりあえず雑にビームサーチを実装して44.7G、4位

幅10でも意外と高順位

幅を動的にしたけど調整が難しい割に対して伸びない(むしろ下がってる?)

遷移を3倍にしたら45.6Gになった 300msくらいしか増えてないしこっちを増やすことを考えるべき?

手元の時間計測がブレブレなのであまり信用できない

実装がよくわからなくてpriority_queueを使ってlogをつけていたDPパートからlogを落とすことに成功…

遷移増やしたらスコアが下がるseedがある さすがにもうちょっと真面目に盤面評価するべきか?

遷移を100個までOKにして46.4G ふ~む

適当にhashを作ったら46.8G 意外としょぼい改善でもいい感じにはなる

盤面評価に今片方だけ入っている家/職場のスコアを絡ませたら47.9Gで3位

0.5Gくらいならどうにか上げられそう(ホント?)

こんなこと言ってたら1位が変わって1G上げないといけなくなってしまった

4日目(2/17)

幅20すら出すのが厳しい TLが足りないよ~

最初のパスを決めるときに家/職場の近くを通るようにするとスコアが下がる ふ~む

ターンごとにまとめてみる?→ダメそう

最初の解をターンごとに突っ込むの忘れてた(は?????) 怖!

最初に突っ込む数もいじって48.3G あと0.9G上げる必要がある

ビームをターンで切るのは微妙か?

たとえば150ターン目にスコアが10000くらいの状態が3W個あって151ターン目にスコアが5000くらいの状態がW個あった場合150ターン目の3W個のうち2W個を削るのは微妙かも

でも調べてみたら大体スコアはターンに対して単調増加っぽいし大丈夫かも

ハッシュを人に対して取って48.3G、2位

このまま適当な幅と適当な時間でビーム打つのは危険すぎる でもどうすればいいのかよくわからん

将来の収入はもうちょっとちゃんと推定できるかも

5日目(2/18)

1位の人とsubmit被りかけて危なかった(1位の人の提出が変わると自分のスコアも変わるので改善したかどうかがわかりにくい)

遷移を増やしてもスコアが伸びるわけではなく、よくわからない…

どうやら線路上に直接駅を立てた時に含まれる家/職場はかなり重要そう

何やってもスコア伸びない時期来たな…

6日目(2/19)

chokudaiサーチはできるかもしれないがかなり大変そうではある

含んでいる家/頂点の数で切ってみる?→ダメダメでした

seed6,11,26,87,89は駅の数で切るといいスコアが出る

駅の数で切って残りターンでの平均資金をスコアにする?→ダメそう

駅を置ける場所を固定してみる?

1位がすごすぎる さすがにこの方針で2G上げるのは無理じゃないか…?

含んでいる家/頂点の数+経過ターンとかにするといいseedもある う~ん…

とりあえず時間調節はいい感じにした 0.01G~0.02Gくらい下がったけどまあ安全を取りたいので仕方ない

遷移増やしたらちょっと伸びて48.04G、3位

7日目(2/20)

なんかhashがuint32_tになってないんだけど 危な!→どうやらuint32_t→int→uint32_tの順でキャストしてたから大丈夫だったっぽい(ホント?)

急に閃いた(いや前から考えていたような気もする?) 点xを取りに行くとき昔そこに線路があったことにできないか?(AHC042みたいな過去改変)

でもそれで改善することはあんまりないか?まあ実装してみないとわからん

線路上に駅を建てると駅の次数が2になるけど更地に立てると3になる

8日目(2/21)

駅を最小全域木で繋ごうと思ったけど次数3以上のところは必ず駅を建てる必要がありうまくいかない う~ん…

メモ:暇ならキューに入れるときではなくキューから出すときにadvanceさせる(変わるか?)

繋がりが切れたところは繋ぎ直す必要があり、大変

でも最後の収入が1000の時10ターン縮めると10000点増えるし頑張るか…

渾身の提出が0.02Gしか上がってなくて終了

9日目(2/22)

やっぱ無理くりにでも幅を増やすべきか?

頑張って高速化したら0.15G伸びた やっぱ高速化かもしれん

どうにか47Gまで戻した

昔消せるpriority_queueとかを実装した気がしてたんだけど見つからない→ブラウザの閲覧履歴でどの時期に実装してたっぽいかを調べる→Atcoder Problemsで何の問題に使ってそうか調べる→AHC037のフォルダにあった…

ちゃんと整理してないからこうなる 後で整理しよう…

消せるpriority_queue使ったけど点数下がった まあOK

10日目(2/23)

到達不能な頂点にcontinue書いてなかった 怖すぎ!

chokudaiサーチにしてみたけど弱くなった う~む

なんか微妙に計測時間がずれる→これメモリ解放に時間かかってる?

やっぱ高速化するとまあまあ伸びるな 0.15Gくらい伸びた

11日目(2/24)

ガチャガチャやって全遷移試せるようにした 0.3Gくらい上がって47.07G

メモ:余裕があるならclangで出したり自動ベクトル化したりしてみる

さすがに駅の位置を固定するのは微妙そう

なんかclangのほうがちょっと強い(ホント~?)

そんなこともないかも

01BFSバグらせてPC壊しそうになった 危ない!

結局gccのほうが強いかも

結果

暫定18位、最終18位 1ページ目でした!

AHC031 日記

注意

  • ほとんどコンテスト中に書いたもの(一部修正)なので、文体などが終わっています
  • いきなり関数名や変数名などが出てくるので、この日記を読むだけでは何を言っているかわからない場合があります
  • 寝たかどうかで日付を変えたのでX日目はX日目~X+1日目の午前くらいまで含まれる場合があります(生活習慣???)

1日目(3/22)

うお~~~
インタラクティブではなさそう
時系列系(?)か~
外周が使えるのがややこしそう
仕切りを実際に置くわけではなく長方形の端点を出力するのか
前作った仕切りがそのまま使えたら嬉しそう
仕切りの移動は長さに比例してコストがかかるけど区画不足は不足分の面積に比例して(*100もされる)コストがかかるのでうまく仕切りを移動させたほうがよさそう
とりあえず仕切りを移動させるコストを無視して日にちごとに区画不足にならないようにするとこれはほぼAHC001か
AtCoder Heuristic Contest 001 (AHC001) 初心者向け解説 - TERRYのブログ
を読みながら雑に遷移を書いた
う~ん 衝突部分で全体的にずらすみたいなのがうまくいっていなさそう
隙間を埋めると得点アップさせたい
実は左右を結ぶ線とそれを結ぶ縦線だけでどうにかなるとか
意外とどうにかなった(びっくり)
|    |
|----|
|    |
|    |
|----|
|    |
|    |
みたいな感じで横線を最初に決め打てばいい感じになる?(スコアを真面目に計算したくない(カス))
というか初日にmax(Ai,j)をiごとにとっていい感じに配置すればタダで済むじゃん
スコア1が達成可能っぽいseedは3000ケースのうち23ケースあった(seed40←嘘すぎ seed32だが???これを書いたのは誰ですか??? とか) 割とある
スコア計算は長方形の四辺を見ればよいのでO(W2+DNW)くらいでできるのか
使ったマスをxorすれば1を数えればよくなるのでbitsetでできそう
横線だけを重ねるの、かなり厳しそう
もしかして分割統治でうまくいく?
縦と横でDPする謎案が生えた 面白そうなので実装
DPしても多少収まらないseedがある でも制約では収まるとは書いてないから仕方ないのか?
上から貪欲にやってるのは改善の余地がありそう
とりあえずDP+山登りを提出したら28位(絶対50489614点、相対9,321,825,027点) 絶対スコアがみるみる下がって楽しい
でも2~4時間くらいでもっと上位の人がいるので絶対もっといい方法があると思う
雑にmaxを取って動かさないようにしたら18/50ケースで最小値になっていてそんな…という感じに
やっぱり動かさないことが大事っぽい
う~ん 1行で最適な動かさない方法は区間DPでできる…? 無理かも

2日目(3/23)

横線が動くの、かなりコストがかかる感じがする
区間のmaxを取って固定する方針だと、N個の面積の値はD2通りあって区間DP的なことをしようとするとO(D4)かかる
いや区間のマージの中心は固定だからD3でできるか?どちらにせよO(D2W2N)のDPは厳しそう
最終的に、基本長方形は動かさずにそのまま使って困ったら長方形を増やしたり減らしたりして対応させたい

3日目(3/24)

昨日なんもせずに寝ちゃった(?) 縦線を最初に固定したら横線を移動する回数が少なくなる? 縦線の挿入/削除/ずらしと長方形の左上の移動で焼ける? 詰め込みはAHC025の貪欲(大きい方からやる)が使えそう
なんか今回総体制という感じで面白いな
分割、あんまり山登れん
std::set::merge、要素を移動するのか~~~い 初めて使う関数はよく確かめよう!(一敗)
うお~どうにかbitsetで実装して提出したら22位(絶対24012026点、相対13,450,273,779点)
そういうことなのか~~~ やっぱり動かさないって大事すぎる
昨日までに書いたコード、13/100しかmaxじゃないらしいです そんな…
貪欲をDPにしたけどあんまり変わらなかった(多少上がった) 多分横を合わせるのは難しいということだと思う
次は幅をいじりたい
すみません、ビンパッキングの貪欲が間違っていました(え?)
とりあえずパッキング問題 | opt100に書いてあったBFDにした まあまあよさそう(最初の貪欲は何だったんだ…?→これNFDかも)
悪化した そんな…
このままビンパッキングを頑張ってもよいがそこまで大事ではなさそうなので保留
なんか思ったより時間余るな(解ができないやつもたまにあるが) う~~~ん

5日目(3/26)

4日目、消滅…(?)
どうにか前作った長方形をできる限り壊したくない
縦の破壊とかも考えたけどその縦線から出る横線が壊れるから微妙か
スコアが「線が重なれば重なるほど良い」から焼きなましで横線の位置をずらすのはスコアがすぐ変わって微妙?
横線の近さをスコアにすればよい?
でも近さ1と近さ0では雲泥の差だからなあ~
あと単純に遷移がわからん a:bにしている横線をランダムに持ってきてa:bで挿入する?
作った盤面とAを最大マッチング(問題の面積コストを最小化)しないといけない
多分B - 展覧会 (Exhibition)の価値が0、大きさが負?のバージョンなので
JOI 本選 2019 B - 展覧会 (AOJ 0659, 難易度 7) - けんちょんの競プロ精進記録を信じて昇順ソートして近いほうから貪欲でいいはず…
雑山登りを出したらまあまあ上がった 40位(絶対23346119点、相対10,199,430,378点)
自分が昔書いた謎DPの中身を思い出せなくなっていた 危ない…(1日毎に二つに分けてDPして積んでいる)
前の日をコピーする遷移とかはどうだろうか
前後をコピー、かなりいいかもしれん(まだわからないが、seed0で1001点を出していて素晴らしい)
いやこれやっぱり形の維持が重要だわ とりあえず高速化します
あと幅いじるのも後で入れてみよう
実行時間10倍で焼きなましするとseed1で100000点くらいまで行くらしい ホント???
さすがに嘘でした スコア計算がバグってた…
というか急にスコアが大きく変わるのであんまり焼きなましに向いてないなこれ スコアをいじるか?
結構頑張って高速化したけどまだ山登れるやつもあるらしい そんな(多少嬉しくはある)
!!! 提出したら21位(絶対21773976点、相対15,699,031,060点)!!! うおおおおおおおおお
謎DPから横線の山登りに繋げられるなら繋げてみたが微妙 時間管理がうまくいってない?
乱数をいじったりしたけどやっぱり普通にスコア計算が遅そう
+-1させる遷移から前後の日の横線に合わせる遷移に変えたら16位(絶対21403191点、相対17,552,957,603点) よしよしよしよしよし
震えが止まらん やべ~~~~~ でもあと5日あるんだよな…
う~むこの方針だと頑張っても20G~25G止まりでは…?
あ~なんか真面目に集合を持っておけばどうにかなるかも 線の移動はその線の階層だけ見ればいいし

6日目(3/27)

定数倍があるにしてももう少し回ってもよくない?
あとおさまりきらないやつも山登りさせてみたい
今一回の更新にO(NlogN)くらいかかってるけどseed1はN=36なのに3秒近く回しても8e5回くらいしか回ってないのはなんでだ~~~
ラムダ式のほうが関数より速そう
C++の関数オブジェクトが関数よりどれだけ速いか - でも今日はSRMあるからに関数オブジェクトのほうが速いって書いてあるけどこれは再帰だから?
なんか思ったよりD日全部で固定可能な長方形があるらしい へ~ 実装してみるか…
やりたいこと:

  • 無理やり全日で固定できるやつを固定する(実装が大変なことになりそうなのでWとNとAを書き換えてごまかす)→ダメだった そもそも入りきるかわからないし入りきったとしてもよくなるとは限らない(幅が大きくなってしまうので)
  • わざと小さい幅にして山登りに託す

7日目(3/28)

同じ幅の中で並び替えるという近傍を思いついたのでやってみる
かなり良かった 17位(絶対11692752点、相対19,398,314,154点)に浮上…
でもこれを頑張っても25Gくらいにしかならないのでは?という気持ちがある
メモ:最終提出ではassertは切る、rand_int()のsource_locationも切る
変えても絶対改善しない日は改善しないようにしたい
改善する確率が低そうな遷移をなくしたら相対スコア下がった 多分スコアが小さいところで負けてるんだと思う
改善しない日は避けるようにしたら多少上がった
vector<vector<int>>とvector<rectangle>の比較はvector<rectangle>の方が速いらしい へ~
適当に破壊して貪欲に埋めるみたいな遷移が必要かもしれん
なんかsortからinsertに遷移を直したのが消滅しとる まあいいか…
あ~ 本当は焼きなましをしたいが…
横線の移動、線が消える+線が増えるの二つの差ができていて微妙 本当は線を増やす→線を消すみたいなことをしたいがどうやってスコア計算すればいいのかわからん
風呂、考察がはかどる(風呂で考察したみたいなのを読んだ気がする)
まず縦を焼いてから横にいくといいかも
あとfake_score_diffはたぶん差分計算がもっとできる(変えた横線だけ見ればよい)

8日目(3/29)

cout << hoge << '\n';の後にassertを書いたのでcoutされないというバグをやった
ずっと困ってたバグ、枝刈りでreturnし忘れていた アホ
なんかmodify_aとmodify_bだけのほうがcとdを追加するよりいいが?なんだこれ
ミスってSolver2の方いじってREしちゃった
Solver2、最後に時間があったらいじりたい
うお~縦の山登りを入れたら12位(相対22,678,161,357点)
しかもこれミスってwidthの大きさが1で済むやつをbreakし損ねているのでもうちょっと上がる
あと縦の遷移は雑だし評価関数ももう少しいいやつがありそう
本当は縦と横を同時に焼きたいが…
改善ポイント:

  • 縦の遷移
  • 埋めるときの貪欲

本当は途中で縦線を外すみたいなことがしたいが…(さすがにそれで改善するケースはたいしてないか?)
バグを直して11位(絶対11438329点、相対24,318,699,958点)
幅を列として持ってると思ってたけどこれ集合として持ってたわ ?
多少真面目な貪欲にしたら6位(絶対11128720点、相対28,654,208,754点) すげ~
今の方針だと多分40G越えられん(涙)
でもこれで20G前後からいきなり30Gくらいまで行った人が何してるか分かった(同じ方針かは分からないが…)
縦でくっつける遷移も増やしたけど(たぶん)参加者のhighestを更新したが相対スコアは落ちるというどうすればいいのかわからない結果に
これ順位表のsnap大事かもしれん 今は6位、絶対11114353点、相対28,692,093,009点
highestを更新しているということはこの方針でも闘えるということなのかな…
上位の人が投げてくれたおかげでちょっと相対スコア上がってる ありがとうございます

9日目(3/30)

ぐわ~ さすがに横棒をいじるところで縦棒を動かしても伸びない(縦棒を動かすだけではスコアは改善しないので当然)
破壊再構築を書けということか… こんなことならちゃんとAを参照で受け取るコードにしておけばよかったぜ
いや~でも全ての日で再構築するのは厳しそう 日ごとに再構築…?
でもそうするとスコア計算がめんどくせ~~~
いやさすがに色んなものを壊しすぎなので改善しない気がする 保留で…
さらに何本か横線を端から端まで引けば固定できる場所が増えて嬉しい?
いやでもwidthの数が増えるだけか?でも固定できる幅が大きくなるのは嬉しいかも…?
いやでもその分幅は大きくなるか う~ん

10日目(3/31)

寝て起きたら順位上がってた 精神状態に良い(?)
適当に山登りをやめるのを100回解を更新しなかったらにしたけどこれがかなりいい値だったっぽい(多少伸びてびっくりした)
微妙な遷移をなくして+1/-1する遷移を+p/-pにしたら6位(絶対10980137点、相対29,575,755,727点)に再浮上
手元の評価、logの総和でいいのかよくわからん
横棒の山登りを焼きなましにしたら5位(絶対10935035点、相対32,002,220,213点)になった いいね
焼きなましの温度が壊れていたので修正したら4位(絶対10946529点、相対32,535,663,873点) OK
温度いじっただけで結構伸びるな もうちょっと頑張れるかも
start_temp=50→絶対10935035点、相対32,535,663,873点
start_temp=60→絶対10931413点、相対32,191,780,353点
start_temp=40→絶対10925410点、相対32,573,956,492点
start_temp=30→絶対10925410点、相対32,133,430,262点
もうネタ切れだ~となりながらなんだかんだで3Gくらい上げていて我ながらえらい
start_temp=45→絶対10931709点、相対31,018,474,409点(上位陣が提出したので相対スコアが変わってしまい困った)
とりあえずstart_tempは40にしておこう
ここにきて順位表がめっちゃ動く ひえ~~~
ハイパラ調整をします optuna頼んだ!

11日目(4/1)

optunaで調整したやつを投げたら下がった 悲しい(log評価が良くなかったのでは…)
山登りの評価関数だけ戻して出したら上がった optunaありがとう…(調整するハイパラをミスった感がある)
順位表動きすぎだろ 勘弁してくれ~~~
Solver2に書き足すかSolverをコピペして書き直すかどっちがいいんだ Solver2に書き足すほうが楽か…
え????? push_widthであるべきところがpush_width_aになってた ?????
でもこのバグ直したら相対スコアは下がったな そんな
ちょっと山登りをいじって6位(絶対10626353点、相対32,410,153,617点) ひ~~~
Solver2を直したけど0.3Gくらいしか上がらなかった 悲しい
よく見たら山登りの遷移がバグってる おいおい
バグ直したら相対スコア下がった はい
上位陣の提出により1Gくらい削られた 許してくれ~
コードを見直したらハイパラが間違ってた 怖
メモ:最終提出は絶対スコアが6804134のやつを出す

結果

暫定8位、最終9位で初赤perf&入黄 やった~~~