✨ Мир Двумерных Структур в C++: Вектор Векторов! ✨
Представьте себе не просто линию чисел, а целую таблицу! В C++ мы можем создать такую "таблицу" с помощью
[Переходим к коду показанном выше]
Что это значит?
Двумерные векторы невероятно гибки и полезны для представления матриц, таблиц, игровых полей и многого другого!
#cpp #вектор #двумерныймассив #программирование #обучение
Представьте себе не просто линию чисел, а целую таблицу! В C++ мы можем создать такую "таблицу" с помощью
std::vector векторов. Это как коробка, в которой лежат другие коробки с элементами.[Переходим к коду показанном выше]
Что это значит?
vector<vector<int>> – мы создаем вектор, каждый элемент которого сам является вектором (vector<int>).{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} – инициализация двумерного вектора, где каждая внутренняя {} представляет собой "строку".matrix[i][j] – чтобы получить доступ к элементу, мы используем два индекса: первый для строки, второй для столбца (помните, индексация начинается с 0!).Двумерные векторы невероятно гибки и полезны для представления матриц, таблиц, игровых полей и многого другого!
#cpp #вектор #двумерныймассив #программирование #обучение
👍3🔥1
⚙️ Возможности такой матрицы!
Двумерный вектор может выполнять все операции которые могут и обычные одномерные вектора. Разница в том, что если в одномерных и обычных массивах элементам служат обычные типы данных (числа, символы), то в матрице векторов в качестве элементом вектора служат сами вектора. То есть вектор векторов.
Например: В выше написанном коде мы сначала объявили пустой вектор. Потом добавили к нему другой простой массив ({1, 2, 3}) - как элемент. Теперь этот массив стал первым элементов главного массива. А потом мы добавили другой такой же массив сделав его вторым элементом в главном массиве.
#cpp #вектор #двумерныймассив #программирование #обучение
Двумерный вектор может выполнять все операции которые могут и обычные одномерные вектора. Разница в том, что если в одномерных и обычных массивах элементам служат обычные типы данных (числа, символы), то в матрице векторов в качестве элементом вектора служат сами вектора. То есть вектор векторов.
Например: В выше написанном коде мы сначала объявили пустой вектор. Потом добавили к нему другой простой массив ({1, 2, 3}) - как элемент. Теперь этот массив стал первым элементов главного массива. А потом мы добавили другой такой же массив сделав его вторым элементом в главном массиве.
#cpp #вектор #двумерныймассив #программирование #обучение
👍2🔥1
Big O: Как не словить Time Limit?
В спортивном программировании мало написать рабочий код — он должен быть быстрым. Big O показывает, как время работы программы растет вместе с размером данных. Если твой алгоритм делает N^2 операций при массиве в 10^5, ты гарантированно получишь ошибку превышения времени (TLE).
С++ за секунду переваривает около 10^8 простых операций. Перед тем как кодить, всегда сопоставляй ограничения задачи с логикой: для 10^5 элементов ищи решение за O(N log N), а для 10^8 подойдет только чистый O(N).
Краткая шпаргалка:
O(1) — Магия (формулы).
O(log N) — Бинарный поиск.
O(N) — Один цикл.
O(N log N) — Сортировка.
O(N^2) — Вложенные циклы (яд для больших данных).
#cpp #algorithms #coding
В спортивном программировании мало написать рабочий код — он должен быть быстрым. Big O показывает, как время работы программы растет вместе с размером данных. Если твой алгоритм делает N^2 операций при массиве в 10^5, ты гарантированно получишь ошибку превышения времени (TLE).
С++ за секунду переваривает около 10^8 простых операций. Перед тем как кодить, всегда сопоставляй ограничения задачи с логикой: для 10^5 элементов ищи решение за O(N log N), а для 10^8 подойдет только чистый O(N).
Краткая шпаргалка:
O(1) — Магия (формулы).
O(log N) — Бинарный поиск.
O(N) — Один цикл.
O(N log N) — Сортировка.
O(N^2) — Вложенные циклы (яд для больших данных).
#cpp #algorithms #coding
👍3
Шаблон для соревнований: почему
В спортивном программировании время на перечисление
Это стандарт де-факто для олимпиадника: код чище, а риск получить CE (Compilation Error) из-за забытого инклуда — нулевой.
Что нужно знать:
‣ Скорость: На время выполнения (Runtime) это не влияет, только на секунду дольше компилится у тебя на ПК.
‣ Совместимость: Работает на всех топовых платформах (Codeforces, LeetCode, на олимпиадах), но может не завестись в Visual Studio.
#cpp #libraries #alghorithms
bits/stdc++.h — это база.В спортивном программировании время на перечисление
<vector>, <algorithm> и <map> — это потерянные минуты. Один хедер #include <bits/stdc++.h> заменяет десятки строк, подтягивая всю стандартную библиотеку GCC разом. В олимпиадном программировании это база, так как ускоряет подготовку, исключает ошибки забытых библиотек и работает в большинстве систем, включая Codeforces. Это стандарт де-факто для олимпиадника: код чище, а риск получить CE (Compilation Error) из-за забытого инклуда — нулевой.
Что нужно знать:
‣ Скорость: На время выполнения (Runtime) это не влияет, только на секунду дольше компилится у тебя на ПК.
‣ Совместимость: Работает на всех топовых платформах (Codeforces, LeetCode, на олимпиадах), но может не завестись в Visual Studio.
#cpp #libraries #alghorithms
👍1
Идеальный компаратор через std::tie
В спортивном программировании часто нужно сортировать объекты по 3–4 критериям (например: баллы ↓, штраф ↑, время ↑). Вместо громоздких каскадов
Почему это стандарт:
• Безопасность: Исключает риск нарушить правила строгого слабого упорядочивания (Strict Weak Ordering), за которые
• Читаемость: Весь приоритет сортировки виден в одной строке.
• Zero-cost: Компилятор эффективно оптимизирует такие сравнения, не создавая лишних объектов в памяти.
#cpp #tie #comparator
В спортивном программировании часто нужно сортировать объекты по 3–4 критериям (например: баллы ↓, штраф ↑, время ↑). Вместо громоздких каскадов
if-else, которые плодят баги, используй лексикографическое сравнение через std::tie. Оно сравнивает элементы последовательно: если первые равны, переходит ко вторым, и так далее.// Сортировка: очки (desc), время (asc)
sort(players.begin(), players.end(), [](auto &a, auto &b) {
return tie(b.score, a.time) < tie(a.score, b.time);
});
Почему это стандарт:
• Безопасность: Исключает риск нарушить правила строгого слабого упорядочивания (Strict Weak Ordering), за которые
std::sort может выдать Runtime Error.• Читаемость: Весь приоритет сортировки виден в одной строке.
• Zero-cost: Компилятор эффективно оптимизирует такие сравнения, не создавая лишних объектов в памяти.
#cpp #tie #comparator
👨💻2
Битовая магия — основы и скорость
В спортивном программировании битовые операции — это не просто способ сэкономить память, это инструмент для экстремального ускорения кода. Они выполняются процессором за один такт и заменяют тяжелые арифметические операции и условия.
Краткий справочник:
•
•
•
•
Почему это важно:
Почти любая задача на подмножества или динамику по маскам строится на этих операциях. Битовый сдвиг влево на k позиций эквивалентен умножению на 2^k, но работает в разы быстрее.
#cpp #bitoperation #alghorithms
В спортивном программировании битовые операции — это не просто способ сэкономить память, это инструмент для экстремального ускорения кода. Они выполняются процессором за один такт и заменяют тяжелые арифметические операции и условия.
int a = 5; // 0101 в битах
int b = 3; // 0011 в битах
int res = a ^ b; // 0110 (XOR) -> 6
Краткий справочник:
•
& ( AND ) : Проверка бита. (n & 1) — проверка на нечетность (быстрее чем % 2).•
| ( OR ) : Установка бита.•
^ ( XOR ) : Инверсия. Помни: a ^ a = 0 (база для поиска одиночного числа).•
<< / >> : Сдвиги. 1 << n — это 2^n за наносекунду.Почему это важно:
Почти любая задача на подмножества или динамику по маскам строится на этих операциях. Битовый сдвиг влево на k позиций эквивалентен умножению на 2^k, но работает в разы быстрее.
#cpp #bitoperation #alghorithms
👍3