Рычаги в подземелье
Условие
В игре-подземелье есть коридор из n магических плиток. Каждая плитка либо светится, либо нет. Сначала все плитки не светятся.
Герой дёргает рычаги. Каждый рычаг действует на подряд идущий кусок плиток: все плитки на отрезке меняют состояние на противоположное (светилась → перестаёт, не светилась → загорается).
Посчитайте, сколько плиток будет светиться после всех рычагов.
Формат ввода
В первой строке два целых числа n и m — число плиток и число рычагов. Далее идут m строк по два целых числа l и r (1 ≤ l ≤ r ≤ n) — границы отрезка, на котором плитки переключаются.
Формат вывода
Выведите одно целое число — сколько плиток светится после всех переключений.
Ограничения
- 1 ≤ n ≤ 2000
- 1 ≤ m ≤ 2000
- 1 ≤ l ≤ r ≤ n
Пример
Ввод:
5 3
1 3
2 5
3 3
Вывод:
4Как решать — идея подхода
Приём: Разностный массив (префиксный XOR)
Ключевое наблюдение: состояние плитки после всех рычагов зависит только от того, сколько раз её перевернули. Важно не число, а чётность: если переключений нечётное число — плитка горит, если чётное — нет (потому что два переворота взаимно отменяются).
Чтобы не переворачивать каждый раз весь отрезок (это было бы медленно), используем разностный массив для «включения/выключения действия» на границах. Для операции «перевернуть» удобно хранить не суммы, а XOR по 0/1.
Идея: для каждого рычага [l, r] отметим, что начиная с l чётность переключений меняется, и после r (то есть с r+1) меняется обратно: diff[l] ^= 1; diff[r+1] ^= 1
Дальше идём слева направо и накапливаем текущую чётность cur как префиксный XOR. Если cur == 1, значит текущая плитка перевёрнута нечётное число раз и горит.
План:
- Создать массив diff длины n+2 из нулей.
- Для каждого отрезка [l, r]: сделать XOR-отметки в diff на l и r+1.
- Пройти i = 1..n, поддерживая
cur ^= diff[i]. - Если
cur == 1, увеличить ответ.
Сложность: O(n + m) по времени и O(n) по памяти.
Частая ошибка: забыть про позицию r+1 (или выйти за границы массива). Поэтому diff делают размером минимум n+2, чтобы r = n тоже обрабатывался корректно.
Разберись руками
Есть 5 плиток (1..5), сначала все выключены: 00000. Потом 3 раза дёргают рычаги и каждый раз на указанном отрезке плитки переключаются (0↔1). Нужно узнать, сколько единиц будет в конце.
- Проиграем рычаги руками. Записывай состояние плиток строкой из 5 символов (0 — не светится, 1 — светится). Старт: 00000. После каждого события напиши новое состояние.
- Теперь отметь номера плиток (от 1 до 5), которые светятся в самом конце (в состоянии 10111).
- Сколько всего плиток светится (то есть сколько единиц в 10111)?
Идея: Аккуратно проигрывай все переключения по очереди: на каждом рычаге меняй состояние плиток на его отрезке. В конце посчитай, сколько плиток оказалось включёнными (важно только, сколько раз каждая плитка переключалась — чётное или нечётное число раз).
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Перечневые олимпиады: что это и что дают — весь перечень Минобрнауки: уровни, срок диплома, разрезы по предметам и классам
- Олимпиада по информатике: с чего начать — два мира олимпиад — ВсОШ и перечневые: этапы, задания и на каком языке писать