10.6Kпросмотров
12 мая 2025 г.
statsScore: 11.7K
0-1 matrix Решал на выходных UniversalCup, расскажу про одну из задач. Если судить по количеству команд, которые ее решили, то она 10-я из 13 по сложности. Хотя на самом деле очень простая. После несложных манипуляций она сводится к следующей. Есть матрица 1000*1000 из нулей и единиц. К ней применяют операции "инвертировать строку i" или "инвертировать столбец j". Под "инвертировать" имеется в виду, что каждый 0 заменяется на 1, а каждая 1 на 0. После каждой операции надо за О(1) определять, правда ли, что вся матрица состоит только из нулей. Если вы хотите подумать над задачей, перед тем как читать решение, то сейчас самое время. Если вы давно читаете мой блог, то наверняка знаете, что я люблю рандомизированные алгоритмы. Сопоставим каждой клетке (i, j) случайное число r[i][j]. Будем поддерживать xor от r[i][j] для всех клеток, в которых стоит единица. Если все клетки нули, то этот xor будет тоже равен нулю. Если же какая-то клетка не ноль, то этот xor будет равен нулю только с вероятностью 2^-64 (если используем 64-битные числа), так что на практике это никогда не случится. Чтобы применять операции за О(1), можно предподсчитать xor всех r[i][j] для каждой строки i и для каждого столбца j, а потом ксорить текущий ксор всех включенных клеток с предподсчитанным значением.