/
最近
.rdf
追記
編集
設定
本棚
翌日へ
前日へ
脳
l
o
g
[
2
0
2
2
0
9
1
8
]
2
0
2
2
年
0
9
月
1
8
日
(
日
)
[
A
t
C
o
d
e
r
]
昨日あ
った
U
N
I
C
O
R
N
プログラミングコンテ
ス
ト
2
0
2
2
(
A
t
C
o
d
e
r
B
e
g
i
n
n
e
r
C
o
n
t
e
s
t
2
6
9
)
のふりかえり
(
精進でも復習でもなく
)
。
コンテ
ス
ト成績証
-
A
t
C
o
d
e
r
。
自分のすべての提出
。
A
C
までの所要時間は
A
=
1分半
、
B
=
4分
、
C
=
4分
、
D
=
1
6
分
、
E
=
1
9
分
、
F
=
4
0
分
。
3
0
分6完なら黄パフ
ォもあ
ったみたいだけど
、
自分は1時間半かかりました
。
E
は取りかかるまでに数分考えたし
、
F
は考えながら実装して詰ま
って考えて実装再開してまた詰ま
って飛ばした
E
問題をチラ見してひらめいて完成させるまでに思いのほか時間がかか
っていた
。
■
A
問
題
「
A
n
y
w
a
y
T
a
k
a
h
a
s
h
i
」
。
自分の提出言語で入出力と四則演算ができますかという問題
。
参加賞
。
謎の
T
a
k
a
h
a
s
h
i
推しだと思
ったら
(
今日にな
って見た
)
問題名が自覚的だ
った
。
■
B
問
題
「
R
e
c
t
a
n
g
l
e
D
e
t
e
c
t
i
o
n
」
。
配列やル
ープが使えますかという問題
。
どうとでも書くことができてかえ
って方向性を定めにくいかもね
。
B
問題を解くのに短く書くとか効率良く解くとかは邪念と変わらない
。
■
C
問
題
「
S
u
b
m
a
s
k
」
。
ビ
ッ
ト列の部分集合を列挙する問題
。
昇順で答えるところを見逃してはいけない
。
何桁目のビ
ッ
トが立
っているかを列挙して
、
0個選ぶ組み合わせ
、
1個選ぶ組み合わせ
、
2個選ぶ組み合わせ……を考えるのが正攻法
。
いや違う
。
入力に1のビ
ッ
トが
k
個あ
ったとして
0
から
(
2
^
k
)
-
1
まで繰り返すのが一番し
っくりくる
。
昇順に答えが見つかるので順番に出力していける
。
この方法はつまり
、
入力から0のビ
ッ
トを取り除いて1のビ
ッ
トだけで
0
/
1
の2択を
k
個組み合わせ
(
2
^
k
通り
)
、
答えるときに取り除いた0のビ
ッ
トを再度補
っていると考えられる
。
ちなみに知
っていれば0のビ
ッ
トを取り除いたり補
ったりする手間をかけずにそのままビ
ッ
ト演算で列挙できる
。
この場合は降順に答えが得られるので逆順で答える
。
蟻本と典型
9
0
問で取り上げられているので知
っている人は知
っている
。
■
D
問
題
「
D
o
u
s
e
h
e
x
a
g
o
n
g
r
i
d
」
(
茶
d
i
f
f
)
。
ハニカムグリ
ッ
ド上で
U
n
i
o
n
F
i
n
d
をやる問題
。
6個の隣接
ノ
ー
ドが問題文に書いてあるので
、
文字通りにやるだ
け
。
……なんだけど
、
考える前に手が動く性分なので
ノ
ー
ドや辺がうまく見えなくて
U
n
i
o
n
F
i
n
d
が書けなか
った
。
座標平面を1列に延ばしておよそ4メガの点列を探索した
。
←の提出は他の提出に比べて桁違いに遅か
ったので
、
方針は同じながら効率に配慮したものを再提出した
(
3
1
4
m
s
→
6
7
m
s
)
。
■
F
問
題
「
N
u
m
b
e
r
e
d
C
h
e
c
k
e
r
」
(
ぎりぎり青
d
i
f
f
)
。
だいたいいつも
E
問題と
F
問題は同時に開いて
、
F
問題を先に読んでパ
ッとは解けないことを確認してから
E
問題に取りかかるんだけど
、
昨日の
F
問題はあからさまに簡単だ
ったのでそのまま取りかか
った
。
チ
ェス盤に連番が書かれていてクエリで指定された矩形領域の白マスに書かれた数字の和をおおよそ定数時間で求める問題
。
連番でも1つ飛ばしでも式は等差級数の式で変わらない
。
W
i
k
i
p
e
d
i
a
で
「
等差数列
」
を開いて2種類の式の使いやすい方を写すだ
け
。
……だと思
ったんだけど1行目の和を求めたあとで3行目5行目を含めた和を一括で求めるのに詰ま
ってしま
った
。
自分はこんなあからさまに単純な法則で増加する数字をまとめて数えることもできないのかと不甲斐ない思いをしたよね
。
各行先頭の白マスを見比べて
2
M
ずつ増えているなと数列の和の式を2階建てで適用したら
、
サンプル1に含まれる6つのクエリのうち最後の1つ以外は正解した
。
え
、
なんで1つだけ合わないとかそんな中途半端がありえるの?
E
問題を読んだのはこのタイミング
。
「インタラク
テ
ィ
ブ
」
の文字が目に入るやそ
っ閉じした
。
インタラク
テ
ィ
ブ問題は
、
問題形式そのものの難しさゆえか解くべき問題は易しめに手加減されていると感じることが多いんだけど
(
実際
E
問題だけど緑
d
i
f
f
だ
った
)
、
や
っぱり問題形式に難しさがある
。
初めての人が標準ライブラリの入出力がバ
ッフ
ァされていることフラ
ッシ
ュの必要があることを理解できなくて
T
L
E
になるのは通過儀礼
。
そこを抜けてもデバ
ッグに手間がかかる
。
昨日の
E
問題は返すべき答えを人間が用意するのに難しさはないからまだましだけど
、
デバ
ッグのためにサ
ーバ
ープログラムを書くとなると時間がかかる
。
F
問題の方が早く解けそうだ
った
。
結局3行目5行目は
2
M
×列数 の割合で増えていたのだ
った
。
■
E
問
題
「
L
a
s
t
R
o
o
k
」
(
緑
d
i
f
f
)
。
N
×
N
のチ
ェス盤に
N
個目のル
ークを置く問題
。
ル
ークは飛車
。
どちらがわかりやすいかど
っちもわからない
か
。
矩形を指定してクエリできるので
、
領域を4つに分けながら絞
っていくのかと最初は考えた
。
行と列が入り乱れて死ぬ未来しか見えない
。
最小2×2の盤面でクエリをシミ
ュレ
ー
トしてみたら
、
結局縦と横で2回のクエリが必要になるのであ
って
、
1つのクエリで盤面を4分の1に限定できるわけではないことがわか
った
。
縦と横で独立して調べるとして
、
2の
1
0
乗はいくつか
(
クエリ総数が
2
0
だから縦と横にそれぞれ
1
0
回しか使えない
)
。
1
0
2
4
。
2の
1
0
乗と
1
0
の3乗の対応は覚えておいて損はない
。
1
0
ビ
ッ
ト
2
0
ビ
ッ
ト
3
0
ビ
ッ
トがキロメガギガに
(
ほぼ
)
対応する
。
サウザ
ン
ドミリオンビリオンでもいいけどね
。
制約は1辺
1
0
0
0
以下
。
制約からも方針の正しさが示唆されるのであとは実装するだ
け
。
以前の日記
に
「
二分探索を使
った解法でかつて最も衝撃を受けたのは
V
a
c
a
n
t
S
e
a
t
というインタラク
テ
ィ
ブ問題に対する提出
#
2
0
5
7
8
1
7
と
#
2
0
6
4
5
3
1
だ
った
。
b
s
e
a
r
c
h
メソ
ッ
ドから呼び出されるブロ
ックの中でクエリを行
っている
。
いやね
、
自分も提出
#
7
9
7
0
5
8
8
の中で二分探索を使
って答えを出してるんだけど
、
そのことと
、
対象となる具体的なソ
ー
ト列がないまま空中で二分探索を行う
、
順序はクエリで動的に決定するということの間に
、
どれだけの隔たりがあることか
」
と書いたくらいなので
、
今回は自分が
b
s
e
a
r
c
h
メソ
ッ
ドの中でクエリを行うタ
ーンだと当然考えたのだけど
、
制約が1回のクエリの無駄も許さないと言
っているので
、
ブラ
ックボ
ックスの
R
a
n
g
e
#
b
s
e
a
r
c
h
メソ
ッ
ドを信頼することができなか
った
。
今回も二分探索を手書きした
。
提出前に気がついたけど
、
手書きした二分探索は複数バグ
っていた
。
■結果は
8
5
分で
ノ
ーミス6完の青パフ
ォ
。
まだかつての
H
i
g
h
e
s
t
に届かない
。
翌日へ
前日へ