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