TGViewer
Боря дорешивает Боря дорешивает @bminaiev_upsolving · 555 subscribers
Post #5 1.42K
GP of Nizhny Novgorod. H.

https://contest.ucup.ac/contest/4126/problem/20255

Не будем углубляться в детали задачи, но там, как и в любой задаче на вычгеом, нужно быть очень аккуратным с точностью вычислений. Существует несколько "школ" того, как правильно писать задачи на вычгеом. Некоторые люди спокойно создают структуру Point с double x, y, добавляют в случайные места программы EPS при различных вычислениях и вообще ничего не бояться по жизни. Я же очень сильно боюсь так делать и стараюсь писать все вычисления в целых числах. Иначе, при получении WA, очень сложно понять это бага в коде или нужно просто поменять EPS.

А еще большинство алгоритмов вычислительной геометрии выражаются через две операции — векторное и скалярное произведение. Например, всякие выпуклые оболочки, пересечения отрезков, проверки на нахождение внутри треугольника и так далее.

Существует много разных способов пересечь две прямых. Расскажу про тот, которым было удобно воспользоваться в данной задаче. Пусть одна прямая задана координатами двух точек A и B лежащих на ней, а другая точками C и D. Нужно найти некоторую точку Q, которая лежит на их пересечении. Запишем позицию Q в виде A + u * (B - A). Удобно, что получив значение u, можно заодно понять где конкретно она лежит по отношению к A и B. Например, если 0 <= u <= 1, то она лежит на отрезке AB. Если u > 1, то на продолжении луча AB.

Как найти u? Мне кажется удобно думать об этом с геометрической точки зрения. Посмтрим на треугольники ADC и BCD. Их площади относятся как u к 1 - u. Площадь треугольника ADC это просто векторное произведение AD * AC (с точностью до 1/2). Отсюда получаем, что u = ADC / (BCD + ADC).

Прикольный факт, что о площадях надо думать как о чем-то, у чего есть знак (и считается по формуле векторного произведения). Тогда эта формула для u продолжает работать даже для u < 0 и u > 1, когда какие-то из площадей отрицательные. А если BCD + ADC = 0, то это обозначает, что AB и CD параллельны.

В таком формате еще очень удобно думать про то, какой тип данных нужен для хранения всего этого. Если координаты были порядка C = 10^9, то векторное произведение порядка C^2, а u это дробь, где числитель и знаменатель порядка C^2. Если мы захотим такие дроби сравнивать, то нужен будет тип, который вмещает C^4 (int128).
  • 👍 23
  • ❤ 5
  • 🔥 2
More from @bminaiev_upsolving
  1. Oct 12, 2026Post #17
  2. Oct 4, 2026Grand Prix of EPS. H. https://contest.ucup.ac/contest/4207/problem/21380 Если убрать все д…
  3. Sep 30, 202647/100. Чтобы в предыдущей задаче посчитать ответ быстрее чем за квадрат надо сделать два…
  4. Sep 30, 2026Оказывается n-е число Каталана можно считать не только как C(2 * n, n) / (n + 1), но и как…
  5. Sep 30, 202646.5/100 https://codeforces.com/contest/2268/problem/E После скучной части про комбинатори…
  6. Sep 28, 2026Вообще прикольный скилл смотреть на perf report и уметь ускорять код в 10 раз чисто механи…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →