Вопросы по алгоритмам
Техника программирования
- Структура типичной программы по программированию на С++
- Потоки вода и вывод в С++
- Ускорение ввода-вывода
- endl vs. '\n'
- Ввод-вывод функциями С
- Считывание строки с пробелами
- Считывание данных неизвестного объема
- Работа с файлами на олимпиаде
- Тип int
- Тип long long int
- Какая проблема здесь может быть: int a = … ; long long b = a*a; ? Решение проблемы.
- Тип __int128_t
- Основные свойства остатков. Вычисление n! по модулю
- Нахождение остатка при делении отрицательных чисел
- Числа с плавающей точкой. Вывод числа с некоторой точностью (С и С++)
- Сравнение чисел с плавающей точкой
- typedef (long long, vector , pair )
- #define
- Макрос с параметрами
- Порождение всех подмножеств множества из n элементов с помощью рекурсии
- Порождение перестановок с помощью рекурсии
- Функция next_permutation()
- Перебор с возратом
- Задача о n ферзях на доске n´n
- Преобразование двоичного представления числа в десятичное
- Получение противоположного числа с помощью дополнительного кода
- Безнаковые целое
- Связь между представлениями знаковым и безнаковым чисел
- Переполнение
- Операция И
- Проверка числа на четность
- Проверка числа на делимость на степень двойки
- Операция ИЛИ
- Операция ИСКЛЮЧАЮЩЕЕ ИЛИ
- Операция НЕ
- Связь числа противоположному данному и инвессией.
- Поразрядый сдвиг
- Умножение и деление на 2 с помощью поразрядных сдвигов
- Получение степеней двойки
- Битовая маска
- Напечатать двоичное представление некоторого целого числа
- Установить k-ый бит числа x в единицу
- Сбросить k-ый бит числа в нуль
- Инвертировать k-ый бит числа
- Сбросить последний единичный бит в нуль
- Сбросить в нуль все единичные биты, кроме последнего
- Инвертировать все биты после последнего единичного
- Проверка числа на степень двойки
- Создание битовой маски типа long long
- __builtin_clz() и __builtin_clzll()
- __builtin_ctz() и __builtin_ctzll()
- __builtin_popcount() и __builtin_popcountll()
- __builtin_parity() и __builtin_parityll()
- Запись подмножеств множества с помощью двоичного представления числа
- Реализация теоретико-множественных операций с помощью порозрядных
- Перебор подмножеств, содержащих ровно k элементов
- Пербор всех подмножеств множества
- Битовые множества С++
Эффективность
- Временная сложность алгоритма
- O нотация
- O(1)
- O(n)
- O(n 2 )
- O(n k )
- Общая временная сложность
- O(nm)
- Временная сложность рекурсивной
- 1+2+4+8+...+2n-1
- Часто встречающиеся оценки временной сложности
- Полиномиальный алгоритм
- NP-трудные задачи
- Оценка временной сложности по размеру входных данных
- Формальное определение времени работы алгоритма
- Нижняя граница времени работы алгоритма
- Точная граница времени работы алгоритма
- Максимальная сумма подмассивов. Решения за O(n3), O(n2). Алгоритм Кадане O(n)
- Задача о двух ферзях. Решения за O(n4), O(n2), O(n), O(1)
- Оптимизация кода
- Оптимизации компилятора
- Особенности процессора
- Кеши
- Распараллеливание
Сортировка и поиск
- Основная задача сортировки
- Пузырьковая сортировка. Временная сложность
- Инверсии
- Максимальное число инверсий
- Сортировка слиянием. Временная сложность
- Нижняя граница временной сложности сортировки
- Сортировка подсчетом
- sort() в С++
- Сортировка по убыванию в С++
- Сортировка массива
- Сортировка строки
- Сортировка строк
- Сортировка пар
- Сортировка кортежей
- Сортировка пользовательского класса. Функция operator<
- Функция сравнения(компаратор)
- Проверка всех элементов на уникальность
- Подсчет числа различных элементов
- Нахождение самого часто встречающегося элемента
- Нахождение двух элементов с минимальной разностью
- Алгоритмы заметающей прямой. Задача про рестаран
- Задача о составлении расписания
- Работы и сроки исполнения
- Двоичный поиск
- Методы реализации двоичного поиска
- Двоичный поиск по ответу
- Задача о k заданиях на n машинах
Структуры данных в C++
- Динамический массив
- Вектор
- Добавление элементов в вектор
- Доступ к элементам вектора
- Создание вектора с перечислением его элементов
- Создание векора с определенным числом элементов и с записанными значениями
- Число элементов вектора
- Обход вектора с помощью цикла (два варианта)
- Доступ к последнему элементу вектора
- Удаление последнего элемента вектора
- Итератор
- Итераторы begin() и end()
- Диапазоном
- Сортировка, разворот и перемешивание элементов вектора
- Обращение к элементу через итератор
- Функция lower_bound()
- Функция upper_bound()
- Применение итератора к функциям
- Метод .erase()
- Двусторонняя очередью (дек)
- Методы дека: push_back(), pop_back(), push_front() и pop_front()
- Стек. push(), pop(), top()
- Очередь. push(), pop(), front()
- Множество
- set
- unordered_set
- Методы множества: .insert(), .count(), .erase(), .finde()
- Перебор элементов множества
- Нахождение наибольшего и наименьшего значений в множестве
- Методы lower_bound(x) и upper_bound(x) в множестве
- Мультимножество. Методы
- Особенности удаления элемента из мультимножества
- Подсчет элементов в мультимножестве
- Отображение (ассоциативный массив)
- map и unordered_map
- Запрос к отображению на несуществующий ключ
- Проверка на наличие ключа в отображении
- Перебор ключ-значение в отображении
- Очередь с приоритетом
- В каких случаях лучше применять очередь с приоритетом?
- Основные операции очереди с приоритетом
- Создания очереди с приоритетом, поддерживающей поиск и удале-
ние наименьшего элемента
- Структура данных indexed_set
- Сравнение множества и сортировки
- Сравнение отображения и массива
Графы
- Понятие графа. Вершины. Ребра
- Путь
- Длина пути
- Цикл
- Свзный граф
- Компоненты связности
- Дерево
- Ориентированный граф
- Взвешенный граф
- Путь во взвешенном графе
- Смежные вершины
- Степень вершины
- Сумма степеней всех вершин графа
- Регулярный граф
- Полный граф
- Полустепень захода
- Полустепень исхода
- Двудольный граф
- Свойство двудольного графа
- Списки смежности
- Матрица смежности
- Список ребер
- Поиск в глубину. Временная сложность
- Поиск в ширину. Временная сложность
- Проверка связности
- Обнаружение циклов
- Проверка графа на двудольность
- Алгоритм Беллмана-Форда. Нахождение отрицательных циклов
- Алгоритм Дейкстры
- Алгоритм Флойда-Уоршела
- Ориентированные ациклические графы
- Топологическая сортировка
- ДП в ориентированном ациклическом графе
- Графы приемников
- Нахождение приемников
- Обнаружение циклов в графе приемников
- Остовное дерево
- Вес остовного дерева
- Минимальное и максимальное остовные деревья
- Алгоритм Краскала
- Система непересекающихся множеств
- Алгоритм Прима