AtCoder / 高橋君のバグ探し
ふくほです。
ABC015-C 高橋君のバグ探し
を解きました。
https://atcoder.jp/contests/abc015/tasks/abc015_3:embed;cite
考えたこと
全探索するとになります。
制約から、は最大でも
になるため、間に合います。
番目までの質問に
答えたときの値のパターンを
queueに入れます。
番目までの質問に
答えたときの値のパターンは
番目までの質問に
答えたときの値と
のxorをすべて試したものになります。
これを、queueのvectorで実装しました。
提出コード
AtCoder / 友達の友達
ふくほです。
ABC016-C 友達の友達
を解きました。
atcoder.jp
考えたこと
友達の友達の友達の…
だとUnionFindで管理することが
最適ですが、
今回は友達の友達までなので
木は使いません。
ユーザーの友達を2重vectorで
管理します。
ユーザーの友達の一人を
としたとき、の友達を全探索します。
の友達をとしたとき
とは友達でないことと
まだが友達の友達として
数えられていないこと
の2つを確認します。
3重ループになりますが、
制約が小さいので大丈夫です。
提出コード
感想
はじめUnionFindで実装してて
あれあれ?ってなってました。
bool配列最高。
vectorの要素で回すfor文、
簡潔で分かりやすくて好き。
AtCoder / バスト避けられない運命
ふくほです。
ABC012-C バスと避けられない運命
を解きました。
atcoder.jp
考えたこと
これは典型的なワーシャルフロイド!
1つめに経由地、2つめに出発地、
3つめに目的地をおき3重ループ
を回します。
ワーシャルフロイドは
3重ループの順番が違っても
3回同じことをすると
最適解が出るらしいので
念のため三回同じループを回しました。
提出コード
感想
初見で苦労した問題の一つです。
そういえばダイクストラ
何も知らないので
最短経路問題に出会った
いい機会だし勉強しておこうかなと
思いました。
どうでもいいですが
ループの順番変えて回した時、
同じこと何回したら最適解が出るかを
探索するためにcntの値を変えて
たくさん提出してたら
初めて提出回数制限が来ました。()
AtCoder / スフィンクスのなぞなぞ
ふくほです。
ABC006-C スフィンクスのなぞなぞ
を解きました。
問題↓
atcoder.jp
考えたこと
鶴亀算を3変数にしたやつですね。
と大きめ。
三重ループは勿論、二重ループ
(2つの値を決めておいて、最後の1つが
条件を満たしているのか吟味する方法)
でも間に合わなさそう。
何とかして多重ループは
避けたいお気持ちでした。
ここで私は思いつきました。
赤ちゃんの数を, 老人の数を, 大人の数を
と置いた時、問題から
の2つの式を満たすことがわかります。
ここから1文字を消去し
2変数の関係式に持ち込みます。
今回はを消去しました。
結果
が得られます。
ここでを固定してみると
このは非負整数になります。
最後に、から
を求めます。
も非負整数であることを
確認する必要があります。
AtCoder / おいしいたこ焼きの売り方
ふくほです。
AtCoder ABC005-C おいしいたこ焼きの売り方
を解きました。
問題↓
atcoder.jp
考えたこと
AとB, sortした状態で
与えてくれるのか、ありがたい。
お客さんとたこ焼きを1:1に
対応させればよいみたいです。
よってqueueを使って早い時間に
できるたこ焼きから
お客さんに渡していく
と考えるのが自然かな。
計算量はくらいになりますが
もも100以下なので間に合います。
(もし間に合わなかったら
どうやって解くんだろ、いもす法…?)
提出コード
感想
初見で解いたのが2020/6/15だったので
5か月ぶりに解いてみたことになりますね。
5か月前の自分はAの配列の
スタート地点を操作して
無理やり計算量削減してました。
この頃、まだqueueの存在
知らなかったと思います。
昔の提出コード↓
Submission #14377258 - AtCoder Beginner Contest 005
これは昔の問題だけど
今コンテストに出てきたら茶diff
真ん中くらいになるのかな…
と思ったりします。怖い。
AtCoder / 幅優先探索
ふくほです。
ABC007-D 幅優先探索
を解きました。
問題↓
atcoder.jp
考えたこと
BFSは習得に苦労した
アルゴリズムの一つでした。
queueが活躍しまくるやつ。
昔のコードではqueueをxとyに
分けていましたが、
今回はひとつのqueueに
座標の情報と最小コストの値を
詰め込みました。
queue
.first.first → 縦の座標
.first.second → 横の座標
.second → そのマスまでの最小移動回数
としました。
また、一度訪れたところを
もう一度探索されると
無限ループに陥るので
bool配列visitedで何とかしました。
(ansの値が0である場合ない場合で
場合分けしてもよかったかもしれない)
あと、配列は0始まりなのでsy~gxは
入力したらとりあえず1ずつ引きました。
初心者の時わからず
これでバグらせまくりました()
提出コード
感想
BFSは基礎なので
しっかり固めていきたいです。
もう空で書けるようになったっ
ベクトル解析 / フレネセレの公式
ふくほです。
ベクトル解析を初めて学んだときに
最初にぶつかった壁
フレネセレの公式について
簡単にまとめます。
1. 必要なベクトルをそろえる
位置ベクトルで与えられる
曲線について考えていきます。
前提として、単位接線ベクトルを
定義しておきます。
(と表記しています)
細字のは変数, 今回の単位接線ベクトルは
ベクトルなので混乱しないようにしてください…
(私は初見で大混乱しました)
それと、今回は曲線の長さで
微分しています。
変数変換が必要なので少し厄介ですね。
1.1. 単位主法線ベクトル
単位主法線ベクトルはの
二階微分の方向の単位ベクトルです。
これをとして
と表すことができます。
(正規化しないものは単に
主法線ベクトルと呼ばれています)
2. 曲率と捩率
上記の二つのベクトルの考え方がわかると
曲率と捩率を求めることができます。
文字通り、曲率は曲線の曲がり具合を
捩率は曲線のねじれ具合を表しています。
(「捩じれる」でねじれるって読むらしい)
2.1. 曲率
曲率はで表すことができます。
の接線の傾きが急に変化するほど
曲率は大きくなります。
このの接線の傾きの変化が
というわけです。
よって、
という関係式が成り立ちます。
これがフレネセレの公式の第1式です。
また、の逆数を曲率半径と呼び
の各点を円の一部と
みなしたとき、その円の半径を
表しています。
個人的にわかりやすかった記事↓
math.keicode.com
2.2. 捩率
捩率は
から求めることができます。
単位従法線ベクトルのところで用いた
の両辺を で微分すると
(途中式は省略しますすみません。)
という関係式が現れます。
ここから、
がわかります。
よって、は, の
両方に直交することが分かりました。
またもと直交しているため
以下の式が成り立ちます。
これがフレネセレの公式の第2式です。
は曲線の長さに対するの変化率を表し
のとき、進行方向から見て右側に
のとき、進行方向から見て左側に
それぞれ曲線がねじれているといえます。
3. フレネセレの公式を完成させる
最後に、の導関数について考えます。
より
が成立します。
この両辺をで微分して整理すると
が得られます。
これがフレネセレの公式の第3式です。
以上長くなりましたが
フレネセレの公式を
すべて導くことができました!
位置ベクトルで表される
曲線において
を曲率()、を捩率
としたとき以下の3式が成立する。
(1)
(2)
(3)
おわりに
初めてこの公式を目にしたのは
自粛期間だったのですが、
よくわからなくて何度も参考書を
読みなおしたのを覚えています。
今こうやって復習できて、また
理解が深まった気がします。
相変わらず、記事としての体裁は
あまり整ってはいませんが…