【CodeForces 868C】Qualification Rounds


链接:

洛谷

题目大意:

\(n\) 个长 \(m\) 的 01 串,问能否找到一个选择方案使得每一位 \(0\) 的个数都不小于 \(1\) 的个数。

\(m\leq 4\)

正文:

这个问题有两个性质:

  1. 手玩几个数据会发现方案中最多两个 01 串。
  2. \(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;
}