#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int base = 2048;
struct SegmentTree {
vector<char>T;
SegmentTree() {
T = vector<char>(2 * base);
}
void add(int v, char x) {
v += base;
T[v] = x;
v /= 2;
while (v) {
T[v] = !T[2 * v] ? T[2 * v + 1] :
!T[2 * v + 1] ? T[2 * v] :
T[2 * v] == T[2 * v + 1] ? T[2 * v] : 1;
v /= 2;
}
}
bool isFull() {
return T[1] != 1;
}
};
vector<SegmentTree>Wiersze(base);
vector<SegmentTree>Kolumny(base);
struct Kolor {
char a;
int b;
char c;
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m; cin >> n >> m;
vector<vector<char>>G(n, vector<char>(m, 0));
for (int i = 0; i < n; i++) {
string s; cin >> s;
for (int j = 0; j < m; j++) {
Wiersze[i].add(j, s[j]);
Kolumny[j].add(i, s[j]);
}
}
vector<Kolor>result;
for (int C = 0; C < n + m; C++) {
for (int i = 0; i < n; i++) {
if (Wiersze[i].isFull() && Wiersze[i].T[1] != 0) {
result.push_back({ 'R', i + 1, Wiersze[i].T[1] });
Wiersze[i].T[1] = 0;
for (int j = 0; j < m; j++) {
if (Kolumny[j].T[1]) Kolumny[j].add(i, 0);
}
}
}
for (int i = 0; i < m; i++) {
if (Kolumny[i].isFull() && Kolumny[i].T[1] != 0) {
result.push_back({ 'K', i + 1, Kolumny[i].T[1] });
Kolumny[i].T[1] = 0;
for (int j = 0; j < n; j++) {
if (Wiersze[j].T[1]) Wiersze[j].add(i, 0);
}
}
}
}
cout << result.size() << '\n';
reverse(result.begin(), result.end());
for (auto p : result) cout << p.a << " " << p.b << " " << p.c << '\n';
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include <iostream> #include <vector> #include <algorithm> using namespace std; const int base = 2048; struct SegmentTree { vector<char>T; SegmentTree() { T = vector<char>(2 * base); } void add(int v, char x) { v += base; T[v] = x; v /= 2; while (v) { T[v] = !T[2 * v] ? T[2 * v + 1] : !T[2 * v + 1] ? T[2 * v] : T[2 * v] == T[2 * v + 1] ? T[2 * v] : 1; v /= 2; } } bool isFull() { return T[1] != 1; } }; vector<SegmentTree>Wiersze(base); vector<SegmentTree>Kolumny(base); struct Kolor { char a; int b; char c; }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m; cin >> n >> m; vector<vector<char>>G(n, vector<char>(m, 0)); for (int i = 0; i < n; i++) { string s; cin >> s; for (int j = 0; j < m; j++) { Wiersze[i].add(j, s[j]); Kolumny[j].add(i, s[j]); } } vector<Kolor>result; for (int C = 0; C < n + m; C++) { for (int i = 0; i < n; i++) { if (Wiersze[i].isFull() && Wiersze[i].T[1] != 0) { result.push_back({ 'R', i + 1, Wiersze[i].T[1] }); Wiersze[i].T[1] = 0; for (int j = 0; j < m; j++) { if (Kolumny[j].T[1]) Kolumny[j].add(i, 0); } } } for (int i = 0; i < m; i++) { if (Kolumny[i].isFull() && Kolumny[i].T[1] != 0) { result.push_back({ 'K', i + 1, Kolumny[i].T[1] }); Kolumny[i].T[1] = 0; for (int j = 0; j < n; j++) { if (Wiersze[j].T[1]) Wiersze[j].add(i, 0); } } } } cout << result.size() << '\n'; reverse(result.begin(), result.end()); for (auto p : result) cout << p.a << " " << p.b << " " << p.c << '\n'; return 0; } |
English