рдиреНрдпреВрдирддрдо рдЙрддреНрддрд▓ рд╣рд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рдереЛрдбрд╝рд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдЕрдиреБрд╕рдВрдзрд╛рди (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рд╛рдЗрдЯ рдкрд░ рдЦреЛрдЬ рдХрд░рдХреЗ) рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╣рдм рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рд╕рд╛рде рд╣рдм рдкрд░ рдХреЗрд╡рд▓ рджреЛ рд▓реЗрдЦ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрд░рд╛ рдирд┐рдХрд▓рд╛ред рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рдЧрдИ рд╣реИ, рдореИрдВрдиреЗ рддрдерд╛рдХрдерд┐рдд рдиреНрдпреВрдирддрдо рдЙрддреНрддрд▓ рдкрддрдВрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рджрд╛рдИрдВ рдУрд░ рдХрд╛ рдЖрдВрдХрдбрд╝рд╛ рдПрдХ рдХрд╕реМрдЯреА рд╣реЙрдХ рд░реАрдбрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рд╣реИ, рдлрд┐рд░ рднреА, рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдФрдкрдЪрд╛рд░рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рджреА рдЬрд╛рдПрдВрдЧреА рдФрд░ рдиреНрдпреВрдирддрдо рдЙрддреНрддрд▓ рдкрддрд╡рд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рджреЛ рд╢рд╛рд╕реНрддреНрд░реАрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдПрдХ рдиреНрдпреВрдирддрдо рдЙрддреНрддрд▓ рдкрддрд╡рд╛рд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛


рд╡рд┐рдорд╛рди рдкрд░ рдмрд┐рдВрджреБ A рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рджреЗрдВ рдпрджрд┐ рд╡рдХреНрд░ H рдЙрддреНрддрд▓ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╡рдХреНрд░ рдХрд╛ рдХреЛрдИ рднреА рд╕реНрдкрд░реНрд╢рдХ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдмрд┐рдВрджреБ рдкрд░ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкрддрд╡рд╛рд░ рдХреЛ рдЙрддреНрддрд▓ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЕрдВрдд рдореЗрдВ, рдиреНрдпреВрдирддрдо рдЙрддреНрддрд▓ рдкрддрд╡рд╛рд░ (рдЗрд╕рдХреЗ рдмрд╛рдж рдХреБрдЫ рд╕рдордп рдПрдордмреАрдмреА) рдиреНрдпреВрдирддрдо рд▓рдВрдмрд╛рдИ (рдиреНрдпреВрдирддрдо рдкрд░рд┐рдзрд┐) рдХрд╛ рдЙрддреНрддрд▓ рдкрддрд╡рд╛рд░ рд╣реИред рдореИрдВрдиреЗ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рд╕реЗ рд╕рд╛рдмрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреНрдпреВрдирддрдо рд╢реЗрд▓ рдХреЛ рдмрд╕ рдЙрддреНрддрд▓ рд╣реЛрдирд╛ рд╣реИред рд╕рднреА рд╢реБрд░реВ рдХреА рдЧрдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдВрдХрдбрд╝реЗ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдВрдХ рдП рдХреЗ рд╕реЗрдЯ рдХреЗ рдПрдордмреАрдУ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╢реЗрд▓ рдПрдХ рдЙрддреНрддрд▓ рдмрд╣реБрднреБрдЬ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХреЛрдиреЗ рдП рд╕реЗ рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдПрдордмреАрдУ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдЕрдВрддрддрдГ рдП рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЪреБрдирдиреЗ рдФрд░ рдЖрджреЗрд╢ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддреА рд╣реИ, рдЗрд╕ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдмрд╣реБрднреБрдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддред рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдХреНрд░рдоред рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдХреЛрдиреЗ рдХреЗ рдХреНрд░рдо рдкрд░ рдПрдХ рд╢рд░реНрдд рд▓рдЧрд╛рддреЗ рд╣реИрдВ - рдмрд╣реБрднреБрдЬ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреА рджрд┐рд╢рд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдЖрдВрдХрдбрд╝рд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдорд╛рд╡рд░реНрдд рд╣реИ)ред

рдПрдордмреАрдУ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдХрд╛рд░реНрдп рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреА рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВред рдиреАрдЪреЗ рд╣рдо рджреЛ рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ - рдЧреНрд░рд╛рд╣рдо рд╕реНрдХреИрди рдФрд░ рдЬрд╛рд░реНрд╡рд┐рд╕ рдорд╛рд░реНрдЪред рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдкрд╛рдпрдерди рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреЛрдиреЛрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд░реЛрдЯреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдХреНрдЯрд░ C рдХреЗ рдХрд┐рд╕ рддрд░рдл рдмрд┐рдВрджреБ C рд╕реНрдерд┐рдд рд╣реИ (рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╡рд╛рдкрд╕реА рдорд╛рди рдмрд╛рдИрдВ рдУрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рджрд╛рдИрдВ рдУрд░ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд╣реИ)ред
def rotate(A,B,C): return (B[0]-A[0])*(C[1]-B[1])-(B[1]-A[1])*(C[0]-B[0]) 


рдЧреНрд░рд╛рд╣рдо рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдердо (рдЧреНрд░рд╛рд╣рдо рд╕реНрдХреИрди)


рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рддреАрди рдЪрд░рдгреАрдп рд╣реИред рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдП рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдХреЛ рдПрдордмреАрдУ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЧрдИ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдПрдХреНрд╕-рд╕рдордиреНрд╡рдп рдХреЗ рд╕рд╛рде рдмрд┐рдВрджреБ (рдП рдореЗрдВ рд╕рдмрд╕реЗ рдмрд╛рдПрдВ рдмрд┐рдВрджреБ)ред рд╣рдо рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХрд╣реЗрдВрдЧреЗ) рд╕реВрдЪреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рд╢реЗрд╖ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреБрдЫ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдЕрдВрдХ рдП рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рд░рдгреА рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдо рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ: рд╣рдо рдПрдХ рд╕реВрдЪреА рдкреА рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреА (рд╕рд░рдгреА рдП рдореЗрдВ рдЙрдирдХреЗ рд╕реНрдерд╛рди)ред рддреЛ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдг рдкреА рдореЗрдВ рдмрд┐рдВрджреБ рдХреЛ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдПрдХреНрд╕-рд╕рдордиреНрд╡рдп рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБ рдмрдирд╛рдирд╛ рд╣реИред рдХреЛрдб:
 def grahamscan(A): n = len(A) #   P = range(n) #    for i in range(1,n): if A[P[i]][0]<A[P[0]][0]: #  P[i]-    P[0]-  P[i], P[0] = P[0], P[i] #      

рдЧреНрд░рд╛рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рджреВрд╕рд░рд╛ рдЪрд░рдг рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреА рдЫрдВрдЯрд╛рдИ рд╣реИ (рдкреА [0] рд╡реЗрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░), рдЙрдирдХреЗ рд╡рд╛рдордкрдВрде рдХреА рдбрд┐рдЧреНрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдЖрд░ = рдП рдкреА [0] рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ред рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ B <C рдпрджрд┐ рдмрд┐рдВрджреБ C, рд╡реЗрдХреНрдЯрд░ RB рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддрддреНрд╡реЛрдВ рдХреА рдЬреЛрдбрд╝реАрд╡рд╛рд░ рддреБрд▓рдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рднреА рдЫрдВрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд╡рд░рд┐рдд рдЫрдВрдЯрд╛рдИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП (рдореБрдЦреНрдп рдПрдХ рдЕрдирд╛рдбрд╝реА * рд╣рд╛рде), рдореИрдВ рд╕рдореНрдорд┐рд▓рди рдЫрдБрдЯрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдБрдЧрд╛ред
* рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд╛рдпрдерди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП ...
рдЗрд╕рд▓рд┐рдП, рдЖрд╡реЗрд╖рдг рджреНрд╡рд╛рд░рд╛ рдЫрдВрдЯрдиреА (рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкрддреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓реЛ рдФрд░ рд╢реВрдиреНрдп рдмрд┐рдВрджреБ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):
  for i in range(2,n): j = i while j>1 and (rotate(A[P[0]],A[P[j-1]],A[P[j]])<0): P[j], P[j-1] = P[j-1], P[j] j -= 1 

рдЫрдБрдЯрд╛рдИ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд┐рдореНрди рдЖрдХреГрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдЕрдм рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдмрд╣реБрднреБрдЬ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрддреНрддрд▓ рдирд╣реАрдВ рд╣реИред

рд╣рдо рддреАрд╕рд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдиреЛрдВ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдХреЛрдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВ рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдЬрд┐рдирдореЗрдВ рд╕рд╣реА рдореЛрдбрд╝ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХреЛрдг рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ)ред рд╣рдо рдПрдХ рд╕реНрдЯреИрдХ рдПрд╕ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реВрдЪреА) рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рдкрд╣рд▓реЗ рджреЛ рдХреЛрдиреЗ рдбрд╛рд▓рддреЗ рд╣реИрдВ (рд╡реЗ, рдлрд┐рд░ рд╕реЗ, рдПрдордмреАрдУ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ)ред
  S = [P[0],P[1]] 

рдлрд┐рд░ рд╣рдо рд╕рднреА рдЕрдиреНрдп рдХреЛрдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдПрд╕ рд╕реНрдЯреИрдХ рдореЗрдВ рдЕрдВрддрд┐рдо рджреЛ рдХреЛрдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЙрдирдореЗрдВ рд░реЛрдЯреЗрд╢рди рдХреА рджрд┐рд╢рд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВ: рдпрджрд┐ рдпрд╣ рджрд┐рд╢рд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рдЖрдк рд╕реНрдЯреИрдХ рд╕реЗ рдЕрдВрддрд┐рдо рд╢реАрд░реНрд╖ рдХреЛ рд╣рдЯрд╛рдХрд░ рдХреЛрдг рдХрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рдореЛрдбрд╝ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрддрд╛ рд╣реИ, рдХреЛрдиреЛрдВ рдХреЛ рдХрд╛рдЯрдирд╛ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  for i in range(2,n): while rotate(A[S[-2]],A[S[-1]],A[P[i]])<0: del S[-1] # pop(S) S.append(P[i]) # push(S,P[i]) 

рдирддреАрдЬрддрди, рд╕реНрдЯреИрдХ рдПрд╕ (рдЬрд┐рд╕реЗ рдЕрдм рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╡рд░реНрдЯреАрдХрд▓, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд╛рдВрдЫрд┐рдд рдЕрдиреБрдХреНрд░рдо рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЕрдВрдХреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рдПрдордмреАрдУ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
  return S 


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдкрд╣рд▓реЗ рдФрд░ рдЖрдЦрд┐рд░реА рдЪрд░рдгреЛрдВ рдХреА рдЬрдЯрд┐рд▓рддрд╛ n рдореЗрдВ рд░реИрдЦрд┐рдХ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдЪрдХреНрд░ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЛ рдПрдХ рдмрд╛рд░ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдПрдХ рдмрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП, рдкреВрд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рджреВрд╕рд░реЗ рдЪрд░рдг рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИ - рдЫрдБрдЯрд╛рдИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЫрдБрдЯрд╛рдИ рдмрдбрд╝реЗ n рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ O (nlogn) рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдХреБрд▓ рдЬрдЯрд┐рд▓рддрд╛ рдорд┐рд▓рддреА рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рд╕рдордп рдХреЛ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд┐рдВрджреБрдУрдВ (рдЬреИрд╕реЗ рд╣рдорд╛рд░реЗ) рдХреА рдЬреЛрдбрд╝реАрджрд╛рд░ рддреБрд▓рдирд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рддреЛ рдпрд╣ рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рдЖрдорддреМрд░ рдкрд░ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЧреНрд░рд╛рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЗрд╖реНрдЯрддрдо рд╣реИред рдлрд┐рд░ рднреА, рдЗрд╕рдХреА рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХрд┐рддрдиреЗ рдХреЛрдиреЗ рдЕрдВрддрддрдГ рдПрдордмреАрдУ (рддреАрди, рдкрд╛рдВрдЪ, рджрд╕ рдпрд╛ рдПрди) рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рд╕рднреА рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд░реИрдЦрд┐рдХ-рд▓рдШреБрдЧрдгрдХ рд╣реЛрдВрдЧреЗред рдЬрд╛рд░реНрд╡рд┐рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдРрд╕реА рдЕрдиреБрдХреВрд▓рди рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдкреВрд░реНрдг рдЧреНрд░рд╛рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛрдб
 def grahamscan(A): n = len(A) #   P = range(n) #    for i in range(1,n): if A[P[i]][0]<A[P[0]][0]: #  P[i]-    P[0]-  P[i], P[0] = P[0], P[i] #      for i in range(2,n): #   j = i while j>1 and (rotate(A[P[0]],A[P[j-1]],A[P[j]])<0): P[j], P[j-1] = P[j-1], P[j] j -= 1 S = [P[0],P[1]] #   for i in range(2,n): while rotate(A[S[-2]],A[S[-1]],A[P[i]])<0: del S[-1] # pop(S) S.append(P[i]) # push(S,P[i]) return S 


рдЬрд╛рд░реНрд╡рд┐рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рдЬрд╛рд░реНрд╡рд┐рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рджреВрд╕рд░рд╛ рдирд╛рдо рдЧрд┐рдлреНрдЯ рд░реИрдкрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИ) рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рд╣реИред рдпрд╣ рджреЛ-рдЪрд░рдгреАрдп рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЫрдВрдЯрд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓рд╛ рдЪрд░рдг рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ - рд╣рдореЗрдВ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдордмреАрдУ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдмрд╛рдПрдВ рдмрд┐рдВрджреБ рдХреЛ рдП рд╕реЗ рд▓реЗ рдЬрд╛рдПрдВред
 def jarvismarch(A): n = len(A) P = range(n) for i in range(1,n): if A[P[i]][0]<A[P[0]][0]: P[i], P[0] = P[0], P[i] 

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ, рдПрдордмреАрдУ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢реАрд░реНрд╖ рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВ, рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ A рдХреЗ рд╕рдмрд╕реЗ рджрд╛рд╣рд┐рдиреЗ рдмрд┐рдВрджреБ рдХреЛ рджреЗрдЦреЗрдВ, рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдХрд░реЗрдВ, рдЖрджрд┐ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдм рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рдЬрдм рд╢реБрд░реБрдЖрддреА рд╡рд░реНрдЯрд┐рдХреНрд╕ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдмрд┐рдВрджреБ рдиреЗ рдПрдордмреАрдУ рдХреЛ рдорд╛рд░рд╛, рдЙрд╕реЗ рдЕрдм рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рд╕реВрдЪреА рдПрдЪ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдордмреАрдУ рдХреЗ рдХреЛрдиреЗ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рд╣рдо рддреБрд░рдВрдд рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢реАрд░реНрд╖ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕реВрдЪреА P рдореЗрдВ рд╣рдо рдЗрд╕ рд╢реАрд░реНрд╖ рдХреЛ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЬрд╣рд╛рдВ рд╣рдо рдЕрдВрддрддрдГ рдЗрд╕реЗ рдЦреЛрдЬ рд▓реЗрдВрдЧреЗ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗ)ред
  H = [P[0]] del P[0] P.append(H[0]) 

рдЕрдм рд╣рдо рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд╣рдо P рдХреЗ рд╕рдмрд╕реЗ рдмрд╛рдПрдБ рдмрд┐рдВрджреБ P рд╕реЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП H рдкрд░ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рд╢реАрд░реНрд╖ рд░реЗрдЦрд╛ рд╢реБрд░реВ рд╣реЛ рд░рд╣реА рд╣реИ, рддреЛ рд╣рдо рдЪрдХреНрд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо P рд╕реЗ H рдкрд░ рдкрд╛рдпрд╛ рдЧрдпрд╛ рд╢реАрд░реНрд╖ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдХрд░рддреЗ рд╣реИрдВред рдЪрдХреНрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╛рдВрдЫрд┐рдд рд╢реЗрд▓ H рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдо рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВред
  while True: right = 0 for i in range(1,len(P)): if rotate(A[H[-1]],A[P[right]],A[P[i]])<0: right = i if P[right]==H[0]: break else: H.append(P[right]) del P[right] return H 

рд╣рдореНрдо, рдореИрдВ рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЬрд╛рд░реНрд╡рд┐рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдВрдХрдбрд╝рд╛ рд╕рдм рдХреБрдЫ рджрд┐рдЦрд╛рддрд╛ рд╣реИ!

рд╣рдо рдЬрд╛рд░реНрд╡рд┐рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдХрджрдо n рдореЗрдВ рд░реИрдЦрд┐рдХ рд╣реИред рджреВрд╕рд░рд╛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рд╣реИ, рдмрд╛рд╣реНрдп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдордмреАрдУ рдореЗрдВ рдЬ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЖрдВрддрд░рд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ n рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреВрд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╣реЗ (рдПрдЪрдПрди) рд╣реИред рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЬреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдЯрд┐рд▓рддрд╛ рди рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХреА рд▓рдВрдмрд╛рдИ (рдЖрдЙрдЯрдкреБрдЯ-рд╕реЗрдВрд╕рд┐рдЯрд┐рд╡ рдПрд▓реНрдЧреЛрд░рд┐рджрдо) рджреНрд╡рд╛рд░рд╛ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдФрд░ рдлрд┐рд░, рдХрд╛рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ , рдЕрдВрдХ рдЧрд┐рд░ рдЬрд╛рдПрдВрдЧреЗред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдП рд╕реЗ рд╕рднреА рдЕрдВрдХ рдПрдордмреАрдУ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рдП рдЦреБрдж рдПрдХ рдЙрддреНрддрд▓ рдмрд╣реБрднреБрдЬ рд╣реИ), рдлрд┐рд░ h = n рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рджреНрд╡рд┐рдШрд╛рдд рдореЗрдВ рдХреВрдж рдЬрд╛рддреА рд╣реИред рд╕рд░реНрд╡реЛрддреНрддрдо рдорд╛рдорд▓реЗ рдореЗрдВ (рдмрд╢рд░реНрддреЗ рдХрд┐ рдП рд╕реЗ рдЕрдВрдХ рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рдкрд░ рди рдкрдбрд╝реЗрдВ) h = 3 рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рд░реИрдЦрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдХреНрдпрд╛ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдордп рдорд╢реАрди ** рдирд╣реАрдВ рд╣реИ ), рддреЛ рд╣рдо рдХреЗрд╡рд▓ рд╕рдорд╕реНрдпрд╛ рдХреА рдкреНрд░рдХреГрддрд┐ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ - рдпрджрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрд┐рдВрджреБ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЛ рднрд░рддреЗ рд╣реИрдВ, рддреЛ (рд╢рд╛рдпрдж) рдЬрд╛рд░реНрд╡рд┐рд╕ рддреЗрдЬрд╝ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛ рдкрд░ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЧреНрд░рд╛рд╣рдо рддреЗрдЬрд╝ рд╣реЛрдЧрд╛, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ ...
** рдПрдХ рдЯрд╛рдЗрдо рдорд╢реАрди рдЖрдо рддреМрд░ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рд╣реИ, рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░рдм рд╡рд░реНрд╖реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдЯрд╛рдЗрдо рдорд╢реАрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП "рдЙрдбрд╝рд╛рди" рдХрд░рддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рдкрдврд╝реЗрдВ, рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд┐рд▓рд┐рдпрди рд╡рд░реНрд╖реЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╕реБрдЪрд╛рд░реВ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП ...

рдкреВрд░реНрдг рдЬрд╛рд░реНрд╡рд┐рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛрдб
 def jarvismarch(A): n = len(A) P = range(n) # start point for i in range(1,n): if A[P[i]][0]<A[P[0]][0]: P[i], P[0] = P[0], P[i] H = [P[0]] del P[0] P.append(H[0]) while True: right = 0 for i in range(1,len(P)): if rotate(A[H[-1]],A[P[right]],A[P[i]])<0: right = i if P[right]==H[0]: break else: H.append(P[right]) del P[right] return H 


рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдиреНрдпреВрдирддрдо рдЙрддреНрддрд▓ рдкрддрд╡рд╛рд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдХрд╛рд░реНрдп рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рдЖрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдЬрд╛рд░реЛрдб рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛)ред рдпрд╣ рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреИрдЯрд░реНрди рдорд╛рдиреНрдпрддрд╛, рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдЖрджрд┐ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдПрдордмреАрдУ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рдВ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рддреАрди рдЖрдпрд╛рдореА рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/In144921/


All Articles