Предлагаю здесь выкладывать разные способы, благодоря которым можно выступить на олимпе лучше. Такие вещи на которые многие не обращают внимания. Например: если нужно искать в монотонной функции, то лучше использовать бин. поиск, а не линейный. Короче выкладывайте, то что знаете и чем не жалко поделиться.
1. Никогда не делайте тернарный поиск по дискретной функции.
2. Когда пишете геомерические задаче, не скупитесь на функции типа
double dist(const point& a, const point& b);
double dist2(const point& a, const point& b); //квадрат расстояния
double makeLine(const point& a, const point& b, double& A, double& B, double& C); //Создает уравнение прямой A*x + B*y + C = 0, проходящей через точки а и b.
void norm(point& a, double newLength) или
point norm(const point& a, double newLength) //Нормирует вектор по данной длинне.
Наличие функция позволяет избегать копи-пасты и структурирует код так, что в нем удобнее искать ошибки. Это особенно полезно в геометрии, так как лично у меня самые часты баги в этой теме - это тупые опечатки X вместо Y, или что-нибудь вроде
point v;
v.y /= getLength(v); v.x /= getLength(v); ))
Прошу прощения, если ошибаюсь, но как тогда разрешить такую ситуацию?
P.S.
Рисовать touch-pad'ом в Paint'е - еще то занятие.
Да, что-то я не то нарисовал.
Я имел в виду проблему, если мы тернаркой ищем максимум в массиве вида
1 2 3 4 5 4 3 2 1.
Ну вот. Осознал в чем я ошибся, когда писал сообщение.
В этом случае нам же все равно что отсекать.
Про stl тоже не соглашусь - по моим впечатлениям там только set/map тормозят, остальным всегда можно пользоваться ничего не опасаясь.
Никогда нельзя писать
if (a==b) ...
где a,b - double
потому как иногда , бывает даже такое: (1/(2.0) != 0.5).
Нужно использовать погрешность.
Ну а это из моей практики самая идиотская ошибка:
Если в условии не сказано , что числа целые - то в 99% случаев они действительные. И это нужно очень внимательно предусмотреть.
А с советом полностью согласен.