WA 求调。
查看原帖
WA 求调。
362750
TernaryTree楼主2024/4/20 11:47
#include <bits/stdc++.h>
#define int long long
#define fs first
#define sc second
#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid ((l + r) >> 1)
#define lc ls, l, mid
#define rc rs, mid + 1, r
#define rep(i, l, r) for (int i = (l); i <= (r); ++i)
#define per(i, r, l) for (int i = (r); i >= (l); --i)
#define gc getchar
#define pc putchar

using namespace std;
using pii = pair<int, int>;
using vi = vector<int>;

const int maxn = 1e6 + 10;
const int maxm = 22;
const bool multidata = 0;

int read() {
	int x = 0, f = 1; char c = gc();
	while (c < '0' || c > '9') { if (c == '-') f = -f; c = gc(); }
	while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc();
	return x * f;
}

void write(int x) {
	if (x < 0) pc('-'), x = -x;
	if (x < 10) return void (pc(x + '0'));
	write(x / 10), pc(x % 10 + '0');
}

int n, m, msk, tmp;
int a[maxn], b[maxn], c[1 << maxm];
int p[1 << maxm];
pii f[1 << maxm], g[1 << maxm];
int cnt[maxm];
int S;

bool cmp(int x, int y) {
	return p[b[x] & S] > p[b[y] & S];
}

pii merge(pii x, pii y) {
	vector<int> u;
	if (x.fs) u.push_back(x.fs); if (x.sc) u.push_back(x.sc);
	if (y.fs) u.push_back(y.fs); if (y.sc) u.push_back(y.sc);
	sort(u.begin(), u.end(), cmp); u.resize(unique(u.begin(), u.end()) - u.begin());
	pii ans;
	if (u.size() >= 2) ans = {u[0], u[1]};
	else ans = {(u.size() ? u[0] : 0), 0};
	return ans;
}

void fake_main() {
	pii x;
	n = read(), m = read(), msk = (1 << m) - 1;
	rep(i, 1, n) rep(j, 0, m - 1) a[i] |= ((tmp = read()) << j), cnt[j] += tmp;
	rep(i, 1, n) g[b[i] = msk ^ a[i]] = {i, 0};
	rep(i, 0, m) rep(s, 0, msk) if (!(s >> i & 1)) g[s] = merge(g[s], g[s ^ (1 << i)]);
	rep(s, 0, msk) f[s] = g[s], p[s] = __builtin_popcount(s);
	rep(i, 0, m) rep(s, 0, msk) if (s >> i & 1) S = s, f[s] = merge(f[s], f[s ^ (1 << i)]);
//	rep(s, 0, msk) {
//		write(s), pc('\n');
//		write(g[s].fs), pc(' '), write(g[s].sc), pc('\n');
//		write(f[s].fs), pc(' '), write(f[s].sc), pc('\n');
//	}
	rep(i, 1, n) {
		int s = 0, ans = 0, qwq = 0;
		rep(j, 0, m - 1) {
			tmp = cnt[j] - (a[i] >> j & 1);
			if (tmp == n / 2) s |= (1 << j);
			else if (tmp > n / 2) ++ans;
		}
		if (f[s].fs == i) write(ans + p[b[f[s].sc] & s]), pc('\n');
		else write(ans + p[b[f[s].fs] & s]), pc('\n');
	}
}

signed main() {
	int T = multidata ? read() : 1;
	while (T--) fake_main();
	return 0;
}
2024/4/20 11:47
加载中...