Mitsubachiのメモ

組合せ論をしています

Div1 バチャ日記3 - Codeforces Round #512

Cでカスみたいなやらかしをして80分溶かした...

codeforces.com

f:id:Mitsubachi88:20220127160514p:plain

AB2完。Cは解説AC。

 

A - Vasya and Triangle

AGC036-Aを思い出したが自力で解くことにした。三角形の座標から面積を求める公式に従って考えて既約としたときに分母を 2 にできなければ不可能というのは分かって、 [tez:2] の時は分子を n で割った商と余りを管理して頑張った。実装がちょっと重たい。

 

B - Vasya and Good Sequences

立っているbit数の和が偶数以外にもどれかが過半数を占めないというのになかなか気づかなかった。反省。

 

C - Putting Boxes Together

a_i - i として考えると 1 つに揃える問題になる。あと、座標 a_i に重さ 1 のが w_i 個あるとすると真ん中のが存在するところに揃えたくて、個数をセグ木に乗せて頑張ればいい。

揃える場所を決めればそれより左と右に分けて座標の総和が分かればいいので個数と総和を持つセグ木でいい。

 

というのはすぐ思いついたが、右端に揃えるのが最適となる場合の処理が甘かった。大反省。

日本言語学オリンピック2022で銀賞を取った話

はじめに

僕は言語学の知識はないので参考となるものはなにもありません。

一年前

 

試験前

去年適当にやって銀取れたので今年もやるかみたいなノリで申し込む。前日ぐらいにJOLの存在を思い出し、JOL2020-1のアラビア語を解く。普通に難しくて今年はまずいな...と思うなど。

 

試験中

とりあえず問題を全部見る。どうみても難化している気がしてまずいぞとなる。

大問1を軽く考える。おそらく大きい記号で子音、小さい記号(>)で母音を示しているようなのだが、>が上の文字にかかっているか下の文字にかかっているかすらわからない。5分ほど考えても進展がないので飛ばす。

 

大問2を見る。接頭辞を前につけるのかなと思ったがmaeがmemaeになるとか書いてるし1個ある間違いもそれっぽそうなのがない。仕方ないので飛ばす。

 

大問3を見る。いつものみたいな感じなのでしばらくはここに粘着することを決める。ある程度は理解できたが動詞の語尾に関する規則がさっぱり見えず、和訳は部分点があるっぽいので穴埋めできるところだけを埋める。ここら辺で45分とか50分とか経っていて流石に焦る。大問4と5に軽く手をつけるもサッパリなので大問1に思い切って戻る。

 

 

戻ってしばらく考える。母音の数と文字数が一致していることを思い出し、6,7とa,cが対応するだろうとなる。ここでどっちがどっちだろうと考えていたが、唐突に下から見る発想が思い浮かび、それに沿って考えるとうまくいった。8,10とh,iの決定で少し迷った覚えがある。文字が似すぎていて同じか違うのかわかりにくかった。(vみたいなやつとか)

 

そのノリで大問2を考える。まあ母音子音が大事だろうというノリで母子と対応付けるとうまくいった。この2問は初見はサッパリだったが戻ってきたら天啓が降ってきてびっくりした。

 

大問4を見る。Xの定義中にXを使う再帰的な定義はやめろ。ざっと眺めて気づいたのはmwanacheがおそらく子供を意味していそうということ。jua AでAのみたいな感じだろうとあたりがつく。しょうがないのでそれに沿って埋めてみる。埋め終わった後にamao/akwelumeとacimweni/cemwaliの違いってなんだとなるとvandu/vakongweが相違点だなあとなり、おそらく性別を意味してるのではとなる。その辺をまとめて書いた。理解しきれてないので抜けはさすがにありそう。

 

大問3は適当にそれっぽく見えたのをまとめた。言語Ⅲへの訳は捨て。

大問5も同じ感じ。nran使いすぎだろどうなってるんだあれ。

 

試験後

今年は厳しいなあと思いつつTwitterを見る。みんな難化していたといって安心。

面接対象も怪しいかなと思ったら入っていて一安心。去年と同じで面接の問題は簡単でよかった。

 

CodeforcesのGood Bye 2021に深夜出たらレートが99吹き飛んだ。競プロできません...

しかもEはs<tなら0にするところをs<=tにしていた、最悪。

 

結果

画像

APLOに出れるので一安心。無精進では銀が限界ですね。

Div1 バチャ日記2 - Codeforces Round #556

#556 を走った。Bが重たかったなあ。

codeforces.com

f:id:Mitsubachi88:20211220163906p:plain

AB2完。Cは解説AC。

 

A - Prefix Sum Primes

4 以上の偶数は見なくていいから途中は 2 をいっぱい並べたいという発想になって 1 の個数で最初と最後に持ってくる数を場合分けしようとか思ったけど、途中で 2,1 を最初に置いて後は 2 を全部やって、 1 を全部やるみたいなのが実装楽だと気付けた。

 

B - Three Religions

制約の You can assume that no religion will have description longer than 250 characters. が露骨にヒントっぽいので 3 乗のDPを考えると dp_{i,j,k} で作りたい文字列の前からそれぞれ i,j,k 文字目までを取るのにindexは最適でどれだけいるかみたいなのが思いついた。

遷移を書くのが少し面倒だった。

 

C - Tree Generator™

これ面白かった。木の u,v 間の距離って  d(u)+d(v)-2 d( lca(u,v)) なのはそうで、 d(u),d(v) は括弧列の部分和  μ で簡単に求められるのだが、 d(lca(u,v)) u,v 間に対応する括弧列の区間で最小となるものに一致するというのが思いつかなかった。

これが分かればセグ木に今の深さ、 a \leq b \leq c として  \max ( μ(a)), \,min ( μ(b)), \max (μ(a)-2μ(b)),\max (-2μ(b)+μ(c)) そして \max(μ(a)-2μ(b)+μ(c)) を乗せればいい。 op を書くのが面倒だった。

Div1 バチャ日記1 - Codeforces Round #485

今回は #485 を走った。C,Dが割と辛かった。
codeforces.com

f:id:Mitsubachi88:20211220113326p:plain

AB2完。C,D,Eは解説AC。

 

A - Fair

制約の  1 \leq s \leq k \leq 100 が露骨にヒントっぽいので多始点BFSを k 回すれば通った。

 

B - Petr and Permutations

転倒数の偶奇とswap数の偶奇は一致するというよくある典型。  O(N \log N) N \leq 10^6 で2secで出すの、少し攻めすぎじゃない?

 

C - AND Graph

これ面白い。  X \ AND \ Y =0 なら Y X の否定  \sim X に包含されてる ( AND=Y )という言い換えすら思いつかなかったのは反省。

m 個の頂点集合 S2^n 個の頂点集合 T を用意して S_i から T_{\sim a_i} への有向辺を張って、 T_i から T_jji から 1 bit削ってできるなら有向辺を張って、 T_{a_i} から S_i への有向辺を張ると、 S_i から S_j へのパスがあることが A_i \ AND \ A_j =0 と同値になる。

で、 AND は交換則があるので、逆方向のパスも存在するっていうこと。なので、後はDFSなりBFSをすればいい。

のだが、グラフを陽に持つとMLEするので陰に持ちつつDFS内部で次に行ける頂点を探す必要がある。 n \leq 20 にしてほしい。

 

D - Perfect Encoding

問題文の読解が難しい。要約すると

数列  b = \left(  b_1,b_2, \cdots , b_m \right) に対し、  f(b) = \prod b_i とする。  f(b) \geq n を満たす  b のうち  \sum b_i が最小となるものについて  \sum b_i を求めろ。

とりあえず最適な b を考えると、 4 以上があるなら半分ごとに分割して損はないし、 23 つ以上あるなら 2,2,23,3 にしても損はしないので、最適解は 22 つ以下で、残りは 3 という形。

なので、 3^k \geq n を満たす最小の整数 k を求める問題を 3 回解けばいいのだが、 n1.5 \times 10^6 桁あるのが難しい。多倍長の掛け算は畳み込みで O(N \log N) でできるので二分探索+繰り返し二乗法で頑張ったのだがTLE。

結論としては、桁数を d とすると  \log {}_3 n d \times \log {}_3 10 の前後になるので、ここの間だけ全探索すればよいという。これでもTLEしたが、原因は数を 10 進数で考えていたからだった。 1000 進数で考えるすなわち 3 桁をまとめて畳み込みすると定数倍高速化が効く。

 

それにしてもきつかった。制約とTLが厳しい。

 

E - Prince's Problem

とりあえず素数ごとに分離する。LCAを考えるとパスの端点を 1 の場合に帰着できる。オイラーツアーの順にセグ木に乗せるテクを使うと数列の範囲に対して \min を取った場合の総和を求める問題になる。

ここで悩んでいたが、数列の値は a の次数なので合計が O(n \log a) になる。これを利用して 1 以上のやつに加算して  1 との \min はただの範囲和として求める。  2 以上のやつに加算して  2 との \min はただの範囲和として求める。というのを繰り返せばよいとなって面白かった。

 

EGMO(Evan Chen) メモ11

Problem 2.16.

問題:

△ABCの内接円に対して辺BC,CA,ABのそれぞれ点D,E,Fが接している。

BC=a,CA=b,AB=c,s=(a+b+c)/2としたとき、AE=AF=s-a,BF=BD=s-b,CD=CE=s-cを示せ。

 

解答:

AF=x,BD=y,CE=zとしたときy+z=a,x+z=b,x+y=cが成立

これらを足し合わせてx+y+z=s

よってx=s-y-z=s-a

同様にy=s-b,z=s-cもいえるので題意は示された

 

Problem 2.18.

問題:

点I'を△ABCのBとCの外角二等分線の交点とする。

このとき、I'は辺BCと辺ABのBからの延長上と辺ACのCからの延長上の全てに接する円の中心であることを示せ。

また、A,I,I'は同一直線上にあることを示せ。(点Iは△ABCの内心とする)

 

解答:

I'からBCに下した垂線の足をXとする

BX=BB'となるような点B'を辺ABのBからの延長上に取り同様に点C'も取る

この時△B'BI'と△XBI'はBB'=BX,BI'=BI',∠B'BI'=∠XBI'より合同であるのでB'I'=XI'

同様にC'I'=XI'がいえるのでこれらより点I'を中心として半径がXI'であるような円は条件を満たす

この円をωとする

直線AB',AC'はωの接線であるので∠B'AI'=∠C'AI'

よってI'は∠BACの二等分線上

Iは△ABCの内心より∠BACの二等分線上であるので示された

 

Lemma 2.19. (Length of Exradius)

問題:

△ABCの内接円の半径をr,辺BCについてAと反対側にある△ABCの傍接円の半径をr'とする。

またBC=a,CA=b,AB=c,s=(a+b+c)/2とする。

r'=r*s/(s-a)を示せ。

 

解答:

Aと反対側にある△ABCの傍接円をωとする

ωの中心をI'とし、ωは直線ABにB'で接するとする

また△ABCの内心をIとし、△ABCの内接円は辺ABと点Fで接するとする

このとき△AFI,△AB'I'は∠AFI=∠AB'I'(=90°),∠FAI=∠B'AI'より相似

よってFI:B'I'=AF:AB'=(s-a):sであるのでB'I'=FI*s/(s-a)

B'I'=r',FI=rよりr'=r*s/(s-a)であるので示された