Помогите с олимпиадой по информатике 11кл ии
Ограничение по времени: 1 секунда
Ограничение по памяти: 256 мегабайт
Вы настраиваете предобработку данных для компьютерного зрения. Камера выдает бинарный кадр — прямоугольную таблицу размера Q × N, где в каждой ячейке записано число 0 или 1.
Во время калибровки используются заведомо однородный тестовый кадр: либо объектив закрыт (ожидаются только нули), либо камера смотрит на равномерный белый экран (ожидаются только единицы). Из-за ошибки полярности у части линий сенсора некоторые строки или столбцы записались «наоборот».
Предобработчик позволяет выполнять два вида действий:
• выбрать некоторые строки и в каждой выбранной строке заменить все нули на единицы, а все единицы на нули;
• выбрать некоторые столбцы и в каждом выбранном столбце заменить все нули на единицы, а все единицы на нули.
Можно ли с помощью таких действий восстановить однородный кадр, то есть сделать так, чтобы все клетки таблицы стали одинаковыми (либо все 0, либо все 1)? Заметим, что мы не знаем, какой именно тест был в момент съемки (чёрный или белый), поэтому допускаются оба варианта.
Формат входных данных
Первая строка содержит два целых числа Q, N (1 ≤ Q, N ≤ 100).
Далее Q строк по N символов 0/1 — исходный кадр (без пробелов внутри строки).
Формат выходных данных
Выведите NO, если восстановить однородный кадр невозможно. Иначе выведите YES, затем строку из Q символов 0/1, показывающую, какие строки нужно инвертировать (символ 1 означает инверсию строки), и на следующей строке — N символов 0/1, показывающих, какие столбцы нужно инвертировать (символ 1 означает инверсию столбца). Если корректных ответов несколько, выведите любой.
Ввод
```
3 4
0110
0010
1111
```
Вывод
NO
Ввод
```
2 2
10
01
```
Вывод
```
YES
10
01
```
Ввод
```
1 1
0
```
Вывод
```
YES
0
0
```
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int Q, N;
if (!(cin >> Q >> N)) return 0;
vector<string> a(Q);
for (int i = 0; i < Q; ) {
string s; cin >> s;
if ((int)s.size() == N) a[i++] = s;
}
auto bit = [&](int i, int j){ return a[i][j] - '0'; };
// Проверка условия: A[i][j] ^ A[i][0] ^ A[0][j] ^ A[0][0] == 0
for (int i = 0; i < Q; ++i) {
for (int j = 0; j < N; ++j) {
int d = bit(i,j) ^ bit(i,0) ^ bit(0,j) ^ bit(0,0);
if (d) {
cout << "NO\n";
return 0;
}
}
}
// Строим инверсии для получения всех нулей
string rows(Q, '0'), cols(N, '0');
for (int i = 0; i < Q; ++i) rows[i] = char('0' + bit(i,0));
for (int j = 0; j < N; ++j) cols[j] = char('0' + (bit(0,j) ^ bit(0,0)));
cout << "YES\n" << rows << "\n" << cols << "\n";
return 0;
}
спасибо за ответ, постараюсь учесть его в своих "дальнейших выкладках". Есть вопрос - копировать или цитировать Вас еще возможно?