蚈算幟䜕孊、たたはどのようにしおオリンピアヌドプログラミングに関䞎したかパヌト1

こんにちは、愛するhabravchane これは私の2番目の蚘事であり、蚈算幟䜕孊に぀いおお話したいず思いたす。



ちょっずした歎史



私はすでに数孊孊郚の4幎生です。プログラミングを始める前は、自分は100数孊者だず思っおいたした。



最初の幎の終わりに、olympiadプログラミングに携わっおいるコンピュヌタヌサむ゚ンスの先生が私に泚目を集めたした。 チヌムごずに1人の数孊者が䞍足しおいたした。 だから、圌らは私にオリンピアヌドのプログラミングに慣れ始めたした。 率盎に蚀っお、私にずっおは非垞に困難でした。最初の幎にDelphiずいう蚀葉を孊んだ人にずっお。 しかし、私の先生は非垞に有胜な専門家であるこずが刀明し、私に良いアプロヌチを芋぀けたした。 圌は私に数孊的な問題を䞎え始めたした。私は最初に玔粋に数孊的に解決し、それからコヌドを曞きたした半分の眪で。



私は先生のアプロヌチが本圓に奜きです。「このトピックに察凊しおから、教えおください。そうすれば、みんなが理解できるように」



したがっお、私が担圓する最初の本圓に重芁なタスクは、正確な蚈算幟䜕孊であり、コンピュヌタヌサむ゚ンスのこのセクションの兞型的なタスクを理解する必芁がありたした。 そしお、私はすべおの責任を持っおこのタスクに取り組むこずにしたした。



informatics.mccme Webサむトのすべおのテストに合栌するように、これらのタスクでどれだけ苊劎したかを芚えおいたす。 しかし今、私はすべおのテストを通過したこずを非垞に嬉しく思い、蚈算幟䜕孊の問題が䜕であるかを知っおいたす。



゚ントリヌ



「蚈算幟䜕孊は、幟䜕孊問題を解決するためのアルゎリズムを研究するコンピュヌタヌサむ゚ンスの䞀分野です。 このような問題は、コンピュヌタヌグラフィックス、集積回路の蚭蚈、技術的なデバむスなどで発生したす。このような問題の初期デヌタは、倚くのポむント、セグメントのセット、ポリゎンなどです。 結果は、䜕らかの質問に察する答え、たたは䜕らかの幟䜕孊的なオブゞェクトのいずれかです。」



この蚘事は十分に倧きいので、2぀の郚分に分割するこずにしたした。最初の郚分はポリゎン、2番目の郚分はさたざたな幟䜕孊的オブゞェクトの盞察䜍眮に圓おられたす。



ベクトルに関する少しの理論



どの端が開始ず芋なされ、どの端が終了であるかが瀺されおいるセグメントは、ベクトルず呌ばれたす。 空間内の任意の点もベクトルず芋なすこずができたす。 このようなベクトルはれロず呌ばれたす。 れロベクトルの開始ず終了は䞀臎し、特定の方向はありたせん。

画像



非れロベクトルABの長さは、セグメントABの長さです。 れロベクトルの長さはれロに等しいず芋なされたす。

2぀の非れロベクトルは、同䞀線䞊たたは平行線䞊にある堎合、共線性ず呌ばれたす。 2぀の非れロベクトルABずCDが同䞀盎線䞊にあり、光線ABずCDが同方向の堎合、ベクトルABずCDは同方向ず呌ばれ、これらの光線が同方向でない堎合、ベクトルABずCDは反察方向ず呌ばれたす。 れロベクトルは、任意のベクトルず敎列しおいるず芋なされたす。



ベクトルのスカラヌ積


ベクトルのスカラヌ積は、これらのベクトルの長さずベクトル間の角床の䜙匊の積に等しい数です。

a、b= | a || b |cos∠a、b

画像

ベクトルが座暙ax 1 、y 1 、bx 2 、y 2 で䞎えられる堎合、スカラヌ積a、b= x 1 x 2 + y 1 y 2 。



ベクトルの斜積


平面内のベクトルの擬䌌スカラヌたたは斜めの積は数ず呌ばれたす

[a、b] = | a || b |sinΞ

どこで 画像 -aからbたでの回転角床反時蚈回り ベクトルaずbの少なくずも1぀がれロの堎合、[a、b] = 0を眮きたす。

ベクトルの座暙がax 1 、y 1 、bx 2 、y 2 の堎合、スキュヌ積[a、b] = x 1 y 2 -x 2 y 1 。

ベクトルの幟䜕孊的に斜めの積は、これらのベクトルがたたがる平行四蟺圢の方向付けられた領域です。

画像



蚈算幟䜕孊の問題におけるベクトルのスキュヌ積は、組み合わせ論の再垰ず同じ堎所にありたす。 これは䞀皮の蚈算幟䜕孊の真珠です。 蚈算幟䜕孊のほずんどすべおの問題には、正面の解決策の代わりにスキュヌ積を䜿甚した簡単な解決策がありたす。



緎習したしょう



䞉角圢から始めたしょう

画像



タスク番号1


タスクは非垞に単玔です。぀たり、入力された3぀の数字a、b、cを䜿甚しお、そのような蟺を持぀䞉角圢が存圚するかどうかを刀断したす。



解決策

ここで、䞉角圢の䞍等匏のみをチェックする必芁があるこずは明らかです。a+ b> c、a + c> b、b + c> a。 興味深いこずに、䞉角圢の䞍等匏を研究するずき、私だけに質問がありたした負の数もこれらの3぀の䞍等匏を満たせたすか いいえ刀明 各䞍等匏を合蚈するず、a> 0、b> 0、c> 0になりたす。したがっお、䞉角圢の䞍等匏は、䞉角圢が存圚するための必芁十分条件です。



タスク番号2


タスクは前のタスクず非垞に䌌おいたすが、䞉角圢は蟺ではなく、頂点の座暙によっお定矩されるずいう違いがありたす。



解決策

䞀芋したずころ、解決策は明癜に思えたす。䞉角圢の蟺を蚈算し、問題を前の蟺に枛らしたす。 ただし、2点Ax 1 、y 1 、Bx 2 、y 2 の間の距離は、匏√x 1 -x 2  2 +y 1 -y 2  2によっお蚈算されるため、ルヌトの損倱が発生する可胜性がありたすこれは、䞉角圢の䞍等匏をチェックするのに悪いです。 䞉角圢がその頂点の座暙によっお定矩されおいる堎合、その蟺の長さを蚈算しお䞉角圢の䞍等匏をチェックする必芁はないこずがわかりたす。 この堎合、これらの3぀の点が1぀の盎線䞊にある堎合にのみ、䞉角圢は存圚したせん。 そしお、これはベクトルの斜めの積によっお簡単に怜蚌されたす。 れロに等しい堎合、ベクトルは同䞀盎線䞊にありたす。぀たり、3぀のポむントはすべお1぀の盎線䞊にありたす。

画像



次のすべおの問題では、䞉角圢の存圚をチェックする手順を調べただけなので、䞉角圢が存圚するず仮定したす。



タスク番号3


䞉角圢は蟺で蚭定されたす。 䞉角圢のタむプを決定したす鈍角、長方圢たたは鋭角。



解決策

䞉角圢の各皮類を思い出しおください。



画像



幟䜕孊のコヌスから、反察偎ではより倧きな角床があるこずがわかっおいたす必芁です。 したがっお、倧きな角床が䜕であるかを知るず、䞉角圢のタむプを理解できたす。

  1. 90°より倧きい角床-鈍角䞉角圢
  2. 90°未満の角床-鋭角䞉角圢
  3. 角床は90°-䞉角圢は長方圢
コサむン定理を䜿甚したす。

画像



明らかに、角床の䜙匊がれロより倧きい堎合、角床は90°未満、れロの堎合、角床は90°、れロ未満の堎合、角床は90°を超えたす。 ただし、少し考えおみるず、角床の䜙匊を蚈算する必芁はなく、その笊号のみを考慮する必芁があるこずを理解できたす。

aは倧きな偎面です。



タスク番号4


タスクは前のタスクに䌌おいたすが、䞉角圢のみがその蟺ではなく、頂点の座暙によっお蚭定されたす。



解決策

問題2ず同様に、このタスクは前のタスクに完党に削枛されおいるず蚀えたすそのたた。 ただし、2番目の問題ず同様に、解決策は単玔化できたす。 䞀般に、䞉角圢がその頂点の座暙によっお定矩されおいる堎合、蟺を蚈算するよりもベクトルを䜿甚しお䜜業する方が垞に簡単です。 前のタスクず同様に、䞉角圢のどの角床が最も倧きいかを刀断する必芁がありたす。 角床のタむプは、それを圢成するベクトルのスカラヌ積の笊号によっお簡単に決定されたす。鋭角の堎合は正、盎角の堎合はれロ、鈍角の堎合は負です。 したがっお、3぀すべおのスカラヌ積をカりントしお乗算する必芁があり、この数の笊号で䞉角圢のタむプを刀断できたす。



タスク番号5


指定された蟺で䞉角圢の面積を芋぀けたす。



解決策

明らかな解決策は、ヘロンの匏を適甚するこずです。

画像

ずころで、誰もこの匏の蚌明に興味がありたせんでしたか

蚌明
画像

以䞊です



タスク番号6


頂点の座暙によっお䞎えられる䞉角圢の面積を蚈算したす。



解決策

前の問題に還元される解決策に぀いおは説明したせんが、線組補品の幟䜕孊的な意味を䜿甚するようにしたす。 2぀のベクトルの幟䜕孊的に斜めの積は、これらのベクトル䞊に匕き䌞ばされた平行四蟺圢の方向付けられた領域を定矩したす。 平行四蟺圢の察角線は2぀の等しい䞉角圢に分割するため、䞉角圢の面積は平行四蟺圢の面積の半分であるこずがわかりたす。

ベクトルax 1 、y 1 、bx 2 、y 2 

画像

S =x 1 y 2 -x 2 y 1 / 2-䞉角圢の向きの領域



タスク番号7


頂点の座暙で䞎えられる点ず䞉角圢が䞎えられたす。 ポむントがこの䞉角圢の内偎、境界線、たたは倖偎にあるかどうかを刀断したす。



解決策

このタスクには、根本的に異なる2぀の゜リュヌションがありたす。 最も魅力的なものから始めたしょう。



゚リア法
画像

䞉角圢AKB、AKC、BKCの面積の合蚈方向付けられおいないが「通垞」が䞉角圢ABCの​​面積より倧きい堎合、ポむントは䞉角圢の倖偎にありたす。 最初の3぀の゚リアの合蚈が4番目の゚リアに等しい堎合、3぀の゚リアの1぀がれロに等しいかどうかを確認する必芁がありたす。 等しい堎合、ポむントは䞉角圢の境界䞊にあり、そうでない堎合は内偎にありたす。

圓然、ベクトルの斜積によっお䞉角圢の面積を蚈算する必芁がありたす。 この方法はあたり良くありたせん。 ここでは浮動小数点比范が䜿甚されるため、比范時に誀った決定が行われる可胜性がありたす。 再び、2番目の方法はベクトルに基づいおおり、あらゆる点ではるかに効果的です。



ハヌフプレヌンチェック
䞉角圢の蟺の少なくずも1぀が、その反察偎の頂点ず異なる半平面に沿ったポむントを「広げ」おいる堎合、ポむントは䞉角圢の倖偎にありたす。 それ以倖の堎合、ポむントが䞉角圢の蟺を含む少なくずも1぀の線に属する堎合、䞉角圢の境界䞊にありたす。 それ以倖の堎合、ポむントは䞉角圢の内偎にありたす。

画像

最初の䟋では、蟺ABは頂点Cず点Kを異なる半平面に分割するため、点は倖偎にありたす。



タスク番号8


頂点の座暙によっお䞎えられるポリゎンの面積の蚈算。



解決策

ポリゎンずは、単玔なポリゎン、぀たり自己亀差のないポリゎンを意味したす。 さらに、凞型たたは非凞型のどちらでもかたいたせん。



この問題は2぀の方法で解決できたす。台圢ず䞉角圢の方向付けられた面積を蚈算するこずです。



台圢法


画像

倚角圢の面積を蚈算するには、図に瀺すように台圢に分割し、結果の台圢の方向付けられた領域を远加する必芁がありたす。これが元の倚角圢の方向付けられた領域になりたす。

S = S A 1 A 2 B 2 B 1 + S A 2 A 3 B 3 B 2 + S A 3 A 4 B 5 B 3 + S A 4 A 5 B 6 B 5 + S A 5 A 6 B 4 B 6 + S A 6 A 1 B 1 B 4

よく知られおいる公匏に埓っお、台圢の面積を考慮したす高さに察する塩基の合蚈の半分

S A 1 A 2 B 2 B 1 = 0.5 *A 1 B 1 + A 2 B 2 *B 2 -B 1 



結果の領域は方向付けられおいるため、そのモゞュラスを蚈算する必芁がありたす。



䞉角圢の方法


画像



前の方法ず同様に、図に瀺すように、倚角圢を台圢ではなく䞉角圢に分割するこずができたす。 その結果、これらの䞉角圢の方向付けられた領域を合蚈するず、再び倚角圢の方向付けられた領域が埗られたす。

S = S O A 1 A 2 + S O A 2 A 3 + S O A 3 A 4 + S O A 4 A 5 + S O A 5 A 6 + S O A 6 A 1



ご芧のずおり、ポリゎンの面積を蚈算するタスクは非垞に簡単です。 理由はわかりたせんが、台圢で割るこずによっおこの問題を解決するこずを奜みたすおそらくすべおのオリンピックでこのように解決したためです。 さらに、2番目の゜リュヌションでは、䞉角圢の面積を斜めの積で蚈算する必芁がありたす。 ヘロンの匏を忘れおはいけない!!!



タスク番号9


倚角圢は、頂点の座暙によっお、トラバヌサルの順序で䞎えられたす。 ポリゎンが凞面かどうかを確認する必芁がありたす。



解決策

倚角圢は、その蟺を含む線に察しお1぀の半平面にある堎合、凞ず呌ばれたす。

画像



問題は、ベクトルのスキュヌ積の蚈算に戻りたす。぀たり、凞倚角圢の堎合、スキュヌ積[A i A i + 1 、A i + 1 A i + 2 ]の笊号は正たたは負です。 したがっお、ラりンドの方向がわかっおいる堎合、凞倚角圢のスキュヌ積の笊号は同じです。反時蚈回りに回る堎合は負ではなく、時蚈回りに回る堎合は正ではありたせん。



タスク番号10


平面䞊の倚角圢必ずしも凞面ではないは、その頂点の座暙によっお䞎えられたす。 敎数座暙が内郚にあるただし境界䞊にないポむントの数をカりントする必芁がありたす。



解決策

この問題を解決するために、補助的な問題を考えたす。セグメントは敎数であるその端の座暙によっお䞎えられたす。 セグメント䞊にある敎数ポむントの数を蚈算する必芁がありたす。 セグメントが垂盎たたは氎平の堎合、端の座暙を枛算しお远加する必芁があるこずは明らかです。 興味深いのは、セグメントが垂盎でも氎平でもない堎合です。 この堎合、セグメントを盎角䞉角圢に完成させる必芁があり、答えは、この䞉角圢の足の長さの最倧公玄数に1を足した数になりたす。

画像



頂点の敎数座暙を持぀倚角圢の堎合、ピヌク匏は有効ですS = n + m / 2-1、ここでSは倚角圢の面積、nは厳密に倚角圢の内偎にある敎数点の数、mは倚角圢の境界にある敎数点の数です。 倚角圢の面積の蚈算方法はわかっおいるので、Sは既知です。 たた、ポリゎンの境界にある敎数ポむントの数を蚈算するこずもできたす。そのため、Peak匏には、未知の䞍明な未知数が1぀しかありたせん。

䟋を考えおみたしょう

画像

S = 16 + 4 + 4.5 + 6 + 1 + 2 = 33.5

m = 15

n = 33.5-7.5 +1 = 27-ポむントは厳密にポリゎンの内偎にありたす

この問題は解決されたした



以䞊です この蚘事を楜しんでいただけたこずを願っおいたす。第2郚を曞きたす。



All Articles