【CodeForces 868C】Qualification Rounds
链接:
洛谷
题目大意:
\(n\) 个长 \(m\) 的 01 串,问能否找到一个选择方案使得每一位 \(0\) 的个数都不小于 \(1\) 的个数。
\(m\leq 4\)。
正文:
这个问题有两个性质:
- 手玩几个数据会发现方案中最多两个 01 串。
- \(m\leq4,2^m\leq16\),所以总共至多 \(16\) 个串。
\(n\leq16\),然后暴力 \(\mathcal{O}(n^2)\)。
代码:
const int N = 1e5 + 10;
inline ll Read() {
ll x = 0, f = 1;
char c = getchar();
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') f = -f, c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
return x * f;
}
int n, m;
int a[N];
int main() {
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);cal
n = Read(), m = Read();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i] += Read() * (1 << j - 1);
sort (a + 1, a + 1 + n);
n = unique(a + 1, a + 1 + n) - a - 1;
if (!a[1]) {
puts("YES");
return 0;
}
bool flag = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++)
if (!(a[i] & a[j])) {
flag = 1;
break;
}
if (flag) break;
}
puts(flag? "YES": "NO");
return 0;
}