Думай быстро, опережай конкурентов и узнавай что-то новое.
В этой строчке вся суть соревновательного программирования. Вам предоставляется удобная среда для размышлений и быстрого решения поставленных вопросов.
Кроме того, решения должны быть приемлемыми для работы в течение заданного ограничения времени в 1 секунду.
Сначала выучите язык программирования. Это может быть C ++ или Java. Но не забудьте изучить тонкости языка. Узнайте, как работают различные типы циклов и операторов if-else. Я бы порекомендовал следующий курс по удеми, чтобы выучить оба прекрасных языка.
Я лично взял их оба. Но теперь я понимаю, что знание многих языков не имеет никакого значения ни для программирования соревнований, ни для прохождения собеседований в FAANGM.
Следующий шаг и бесконечный шаг - освоить структуры данных и алгоритмы.
Это самая сложная и забавная задача. Иногда вы хлопаете своим ноутбуком, и вам никогда не захочется его видеть в своей жизни. Посмотрите, что происходит со всеми, кто называет себя программистами.
Вот несколько сайтов, которые помогут вам на протяжении всего вашего путешествия. Они очень полезны.
1 набор основных вещей
- Проблемы с печатью выкройки
- анализ временной сложности
- линейный поиск и представление кругового массива
- палиндром и другие числа (идеальный, Армстронг) для основных задач с числами
- Простая проблема хеширования (подсчет частоты и прочее)
- Задачи суммы префиксов (1D и 2D) {codeforces}
- Техника раздвижного окна (2 конкурса из 5)
Математика и теория чисел
Основы теории чисел
- Бинарный поиск обязателен (2/5 конкурсов)
- НОД 2 чисел в логарифмическом времени (евклидов и расширенный евклидов алгоритм)
- линейное диофантово уравнение
- Проверка простого в sqrt (n) сложности
- Сито Эратосфена (очень сложно выполнять запросы на простое число)
- Сегментированное сито
- Нахождение разложения числа на простые множители в log (n) на запрос
- Функция Эйлера-Тотента
- Маленькая теорема Ферма
- Теорема Вильсона
(gfg статьи и хакерские исследования земли за 8,9,10)
Более жесткая версия теории чисел
- Нахождение x ^ n в log (n)
- Модульная арифметика
- Модульное обратное число
- Модульное возведение в степень
- Китайская теорема об остатках
- Факториальный модуль Mod
- Нахождение nCr и nPr для запросов (постоянное время)
- Принцип включения-исключения (задачи комбинаторики) {у hackerearth есть замечательная связка} {codeforces}
Некоторые базовые алгоритмы.
- узнать об основных алгоритмах сортировки (пузырь, выбор, вставка)
- решать конструктивные задачи, в которых много терминов.
- решить проблемы, связанные с подходом с двумя указателями.
- Битовая манипуляция (сдвиг влево, сдвиг вправо, xor, или, и, установить бит, MSB, LSB и т. Д.)
- Набор мощности данного массива или строки с использованием BIT
- Количество подмассивов с XOR равным нулю (не алгоритм, но обязательная проблема) (HackerEarth имеет очень хорошее руководство по манипуляции с битами, кодирование блоков для правильного видео на бит) {для проблем посетите hackerearth}
- Проблемы, связанные с тегом жадного алгоритма
- Алгоритм Кадане и связанные с ним проблемы
- Задача упорядочивания заданий и выбора действий (после выполнения 8 и 9 перейдите к кодированию и решите проблемы с жадным тегом на них.)
Давайте делать это снова и снова.
Fime, чтобы узнать рекурсию
- начните с основных задач, таких как нахождение факториала и все такое.
- реализовать бинарный поиск
- реализовать модульное возведение в степень с помощью рекурсии
- решать проблемы рекурсии, такие как поиск подмножества с данным и другие, чтобы получить сильную хватку
- Узнайте о сортировке слиянием и быстрой сортировке
- решать проблемы, связанные с сортировкой слиянием
- Решайте проблемы с возвратом, такие как судоку и N Queen, это поможет вам, когда вы захотите решить проблемы DP Path
(для рекурсии вы можете обратиться к leetcode или к практике gfg, где вы обнаружите проблемы с рекурсией и возвратом)
После рекурсии:
- Встречайте в середине алгоритм и проблемы, связанные с ним. 2. Разделяй и властвуй над проблемами {настоятельно рекомендуется использовать кодовые силы только для этого}
- Следующий больший элемент и следующий меньший элемент с использованием стека
- проблемы, связанные со скобками.
- самая большая прямоугольная область на гистограмме. (концепция используется во многих задачах)
- Проблемы, связанные с кучей (приоритетной очередью) (хотя она попадает в категорию жадных по приоритетной очереди, это поможет вам изучить встроенную стандартную библиотеку шаблонов или библиотеку коллекций Java)
Продвинутые части и игра решающая
Строковые алгоритмы:
- хеширование строк (изучить и решить проблему, понять, когда происходит коллизия) {cpalgorithms написал замечательную статью об этом) {Spoj или codeforces}
- Алгоритм Рабина Карпа (на cpalgorithm.com есть замечательный блог)
- Функция префикса
- KMP Алгоритм
- Z-функция
- Алгоритм Манчерса (как только вы завершите приведенные выше алгоритмы, решите на них кучу проблем (25–30) с разных платформ).
Алгоритм дерева:
- Представление дерева / графика
- Обход DFS / BFS в графике / дереве
- Основные параметры (диаметр дерева, высота дерева, уровень дерева)
- Эйлер тур по дереву (учиться и решать задачи)
- Поиск LCA с помощью Euler Tour (14:00) (эффективное решение использует деревья сегментов)
- Поиск LCA с помощью двоичного лифтинга.
- Расстояние между двумя узлами.
- Проблемы поддерева. (SPOJ также настоятельно рекомендуется для проблем с деревьями и codeforces D и E)
Графики:
- Связанные компоненты.
- Топологическая сортировка.
- Обнаружение цикла в графике
- Двудольный график регистрации
- SCC с использованием алгоритма Косараджу
- Алгоритм Дейкстры
- Источники для изучения алгоритмов Беллмана-Форда: блоги HackerEarth и cpalgorithm
(25–30 задач по вышеуказанным темам, SPOJ и codeforces, также HackerEarth)
Потом:
- Мосты в графах
- Точка сочленения на графике
- Минимальное связующее дерево с использованием алгоритма Краскала
- Алгоритм Прима
- 0/1 BFS (большой спаситель)
- Изучите поиск мостов онлайн (cpalgorithms) Решите проблему
Динамическое программирование:
- Пройдите образовательные соревнования AtCoder по динамическому программированию (всего 26).
- Решать проблемы из SPOJ (настоятельно рекомендуется, поскольку он не использует никаких других алгоритмов)
- Проблемы с практикой динамического программирования Google, codeforces, у меня будет замечательный блог с множеством проблем. После всего вышеперечисленного стандартного DP изучите:
- Понять, как мы пишем повторение для Digit DP (блог codeforces) (цифровая динамическая программа) и решать проблемы
- читать о DP с Bitmasks и решать проблемы (блог HackerEarth)
- DP на деревьях (статьи gfg, видео Рахит джайн)
- SOS DP (блог cpalgorithm) Решите как можно больше проблем
- Непересекающийся набор (cpalgorithms)
- Автономные запросы с использованием Disjoint Set (проблема с красочным массивом от spoj)
- Алгоритм Крускала с использованием непересекающегося множества Решите кучу проблем, описанных выше
- Разреженный стол (не тот чертенок)
- Дерево Фенвика и двоичный подъем на дереве Фенвика (прочтите также о трюке с обновлением диапазона)
- проблемы на дереве Фенвика
- Возведение в степень матрицы (проблемы)
- Техника Sqrt Decomposition (gfg, cpalgorithms или codeforces)
- Операции обновления и запросов
- Алгоритм Мо (решение мощного массива из codeforces) (блог codeforces)
- Алгоритм Мо на деревьях
- Дерево сегментов (обязательно) (запросы диапазона и обновления точек)
- Ленивое распространение на деревьях сегментов
Затем несколько необязательных и редких:
- Теория Спрага-Гранди
- Потоки и связанные с ними проблемы
- Разложение тяжелого легкого
- Алгоритм выпуклой оболочки
- БПФ / NTT
Послушайте, то, что я говорю, это всего лишь мой опыт, поэтому, пожалуйста, не пропускайте это. Вы столкнетесь со многими проблемами, ниже приведены решения многих из них.
Психическое отношение - это то, чего людям больше всего не хватает, помните, что могут быть моменты, когда вы, возможно, захотите бросить все это и прожить свою жизнь, как вы были.
Даже я страдал от того, что было много тем, о которых я не знал всех, из-за которых я не мог решать вопросы, я продолжал и продолжал целый день, не решая ни одного вопроса.
Идея здесь состоит в том, чтобы дать вопросу свежие 15–20 минут, 30–40 минут в зависимости от уровня сложности вопроса. Если вы все еще не можете хорошо отвечать на вопросы, посмотрите, как в редакционной статье этого конкретного вопроса есть небольшой намек, а затем используйте свой мозг. и полный вопрос должен быть решен в течение 1 часа.
Делая это инвестируя более 6 часов в день в течение 4 месяцев, вы решите около 720+ вопросов, которых более чем достаточно, чтобы достичь кандидата в мастера в Codeforces или взломать любую компанию FAANGM.
Пожалуйста, следуйте за мной, поделитесь с друзьями.
🤫Как я использую свое понятие, чтобы повысить уровень подготовки к суточным.