n 行 m 列矩陣,給定每行和、每列和,以及若干約束(如「所有元素 > 1」、「第 1 行第 2 列 = 5」)。判斷是否存在滿足所有約束的矩陣。
// 約束類型:0 0 全體
// 0 c 第 c 列
// r 0 第 r 行
// r c 單元格 (r,c)
void applyConstraint(int r, int c, char op, int d) {
auto update = [&](int u, int v, int low, int high) {
L[u][v] = max(L[u][v], low);
R[u][v] = min(R[u][v], high);
if (L[u][v] > R[u][v]) flag = true; // 衝突
};
if (r == 0 && c == 0) // 全體
for (i=1..n) for (j=1..m) update(i, j+n, ...);
else if (r == 0) // 整列
for (i=1..n) update(i, c+n, ...);
else if (c == 0) // 整行
for (j=1..m) update(r, j+n, ...);
else // 單元格
update(r, c+n, ...);
}
clear() 圖、重置 L/R 矩陣。int 足夠(行列和 ≤ 10⁴),但累加和建議 long long。