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
85
86
87
88
89
90
91
92
93
94
| // 더 많은 정보는 42jerrykim.github.io 에서 확인하세요.
#include <bits/stdc++.h>
using namespace std;
struct TwoSAT {
int numVars;
vector<vector<int>> graph, reverseGraph;
vector<int> compId, order;
vector<char> visited;
TwoSAT(int n) : numVars(n) {
graph.assign(2 * n, {});
reverseGraph.assign(2 * n, {});
visited.assign(2 * n, 0);
compId.assign(2 * n, -1);
}
static inline int negateLiteral(int x) { return x ^ 1; }
// Add clause (p ∨ q), where p, q are literal indices in [0, 2*numVars)
void addOrClause(int p, int q) {
int np = negateLiteral(p), nq = negateLiteral(q);
graph[np].push_back(q);
graph[nq].push_back(p);
reverseGraph[q].push_back(np);
reverseGraph[p].push_back(nq);
}
void dfs1(int v) {
visited[v] = 1;
for (int to : graph[v]) if (!visited[to]) dfs1(to);
order.push_back(v);
}
void dfs2(int v, int cid) {
compId[v] = cid;
for (int to : reverseGraph[v]) if (compId[to] == -1) dfs2(to, cid);
}
bool satisfiable(vector<int>& assignment) {
for (int v = 0; v < 2 * numVars; ++v) if (!visited[v]) dfs1(v);
int cid = 0;
for (int i = (int)order.size() - 1; i >= 0; --i) {
int v = order[i];
if (compId[v] == -1) dfs2(v, cid++);
}
assignment.assign(numVars, 0);
for (int i = 0; i < numVars; ++i) {
if (compId[2 * i] == compId[2 * i + 1]) return false;
assignment[i] = compId[2 * i] > compId[2 * i + 1];
}
return true;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int k, n;
if (!(cin >> k >> n)) return 0;
TwoSAT solver(k);
auto literalOf = [](int lampIndex1Based, char color) {
// Xi means lamp is Blue; ¬Xi means Red
int base = 2 * (lampIndex1Based - 1);
return (color == 'B') ? base : (base ^ 1);
};
for (int i = 0; i < n; ++i) {
int l1, l2, l3;
char c1, c2, c3;
cin >> l1 >> c1 >> l2 >> c2 >> l3 >> c3;
int a = literalOf(l1, c1);
int b = literalOf(l2, c2);
int c = literalOf(l3, c3);
// At least two of (a, b, c) must be true: (a∨b) ∧ (a∨c) ∧ (b∨c)
solver.addOrClause(a, b);
solver.addOrClause(a, c);
solver.addOrClause(b, c);
}
vector<int> assign;
if (!solver.satisfiable(assign)) {
cout << -1 << '\n';
return 0;
}
for (int i = 0; i < k; ++i) {
cout << (assign[i] ? 'B' : 'R');
}
cout << '\n';
return 0;
}
|